服务器之家

服务器之家 > 正文

浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解

时间:2021-01-10 14:20     来源/作者:Android开发网

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

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

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部