浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
首先从字面意思理解两个词
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)先点击界面中的按钮
(2)再点击界面中的其它区域
结论:llayout 中 onintercepttouchevent 默认返回值为false,ontouchevent 默认返回值为false,所以只调用了action_down事件;
lview中 ontouchevent 默认返回值为true;调用了action_down,action_up 两个事件;
(3)修改llayout中onintercepttouchevent返回值为true,再次运行代码:
结论:llayout中onintercepttouchevent返回了true,对触摸事件进行了拦截,所以没有将事件传递给view,而直接执行了llayout中的ontouchevent事件;
(4)把llayout中onintercepttouchevent返回值改为false,再把lview中的ontouchevent改为返回false:
结论:由于将lview中ontouchevent返回值修改为false,因此只执行了action_down,然后就到llayout中执行ontouchevent事件了;
viewgroup里的onintercepttouchevent默认值是false这样才能把事件传给view里的ontouchevent.
viewgroup里的ontouchevent默认值是false。
view里的ontouchevent返回默认值是true.这样才能执行多次touch事件。
推荐阅读
-
浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
-
android中Intent传值与Bundle传值的区别详解
-
Android开发笔记之:Handler Runnable与Thread的区别详解
-
Android中onInterceptTouchEvent、dispatchTouchEvent及onTouchEvent的调用顺序及内部原理详解
-
浅谈C语言=与==的区别详解
-
浅谈PHP与C#的值类型指向区别的详解
-
浅谈PHP与C#的值类型指向区别的详解
-
浅谈PHP与C#的值类型指向区别的详解_PHP
-
Android中onInterceptTouchEvent、dispatchTouchEvent及onTouchEvent的调用顺序及内部原理详解
-
浅谈PHP与C#的值类型指向区别的详解_PHP教程