浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解

时间:2022-03-02 06:11:21

首先从字面意思理解两个词

ontouchevent:触发触摸事件

onintercepttouchevent:触发拦截触摸事件

通过查看源代码及类继承关系

onintercepttouchevent:是定义于viewgroup里面的一个方法,此事件是用于拦截触摸事件的,viewgroup(继承自view),一个view的group,也就是我们的一个布局如linerlayout,各个布局类都继承自viewgroup;

ontouchevent:是定义于view中的一个方法,处理传递到view的手势触摸事件。手势事件类型包括action_down,action_move,action_up,action_cancel等事件;

其中viewgroup里的onintercepttouchevent默认返回值是false,这样touch事件会传递到view控件,viewgroup里的ontouchevent默认返回值是false;

view里的ontouchevent默认返回值是true,当我们手指点击屏幕时候,先调用action_down事件,当ontouchevent里返回值是true的时候,ontouch会继续调用action_up事件,如果ontouchevent里返回值是false,那么ontouchevent只会调用action_down而不调用action_up。

1、新建两个类llayout , lview 如下

复制代码 代码如下:

public class llayout extends framelayout {
 // viewgroup
 @override
 public boolean onintercepttouchevent(motionevent ev) {
  log.i("ltag", "llayout onintercepttouchevent");
  log.i("ltag", "llayout onintercepttouchevent default return" + super.onintercepttouchevent(ev));
  return super.onintercepttouchevent(ev);
 }
 // view
 @override
 public boolean ontouchevent(motionevent event) {
  log.i("ltag", "llayout ontouchevent");
  log.i("ltag", "llayout ontouchevent default return" + super.ontouchevent(event));
  return super.ontouchevent(event);
 }
}
public class lview extends button {
 // textview <-- view
 @override
 public boolean ontouchevent(motionevent event) {
  log.i("ltag", "ontouchevent");
  log.i("ltag", "ontouchevent default return" + super.ontouchevent(event));
  return super.ontouchevent(event);
 }
}


 2、修改布局文件为如下布局
 

复制代码 代码如下:

 <com.touchpro.llayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >
  <com.touchpro.lview
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/app_name" />
</com.touchpro.llayout>


(1)先点击界面中的按钮
浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
(2)再点击界面中的其它区域
浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
结论:llayout 中 onintercepttouchevent 默认返回值为false,ontouchevent 默认返回值为false,所以只调用了action_down事件;

 

lview中 ontouchevent 默认返回值为true;调用了action_down,action_up 两个事件;

(3)修改llayout中onintercepttouchevent返回值为true,再次运行代码:
浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
结论:llayout中onintercepttouchevent返回了true,对触摸事件进行了拦截,所以没有将事件传递给view,而直接执行了llayout中的ontouchevent事件;

(4)把llayout中onintercepttouchevent返回值改为false,再把lview中的ontouchevent改为返回false:
浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
结论:由于将lview中ontouchevent返回值修改为false,因此只执行了action_down,然后就到llayout中执行ontouchevent事件了;

viewgroup里的onintercepttouchevent默认值是false这样才能把事件传给view里的ontouchevent.

viewgroup里的ontouchevent默认值是false。

view里的ontouchevent返回默认值是true.这样才能执行多次touch事件。