欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解

程序员文章站 2023-11-28 23:10:58
首先从字面意思理解两个词 ontouchevent:触发触摸事件 onintercepttouchevent:触发拦截触摸事件 通过查看源代码及类继承关系 onin...

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

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事件。