博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android触摸事件流程剖析
阅读量:6422 次
发布时间:2019-06-23

本文共 1868 字,大约阅读时间需要 6 分钟。

hot3.png

Android中的触摸事件流程就是指MotionEvent如何传递,主要包括两个阶段:

1、onInterceptTouchEvent触摸事件拦截方法传递,从外到里传递

2、onTouchEvent触摸事件处理方法传递,从里到外传递

现在做一个例子探索触摸事件的流程,效果图如下:

从外到里的视图依次是ViewGroup1、ViewGroup2、View。

ViewGroup1的触摸相关方法如下(ViewGroup2类似):

private boolean intercept = false;//拦截方法返回的标志位,是否拦截触摸事件  @Override public boolean onInterceptTouchEvent(MotionEvent ev) {        Log.e("touch", "MyViewGroup1 return " + this.intercept + " onInterceptTouchEvent " + ev.toString()); return this.intercept;    } private boolean handle = false;//触摸处理方法返回的标志位,是否处理触摸事件  @Override public boolean onTouchEvent(MotionEvent event) {        Log.e("touch", "MyViewGroup1 return " + this.handle + " onTouchEvent " + event.toString()); return this.handle;    }
View的触摸相关方法如下(View并没有onInterceptTouchEvent方法):
private boolean handle = false;//触摸处理方法返回的标志位,是否处理触摸事件  @Override public boolean onTouchEvent(MotionEvent event) {        Log.e("touch", "MyView return " + this.handle + " onTouchEvent " + event.toString()); return this.handle;    }

现在点击中间的View,Log日志如下:

总结1:在onInterceptTouchEvent和onTouchEvent中都返回false时,MotionEvent的ACTION_DOWN会走一遍传递和处理流程,然后就再没有传递进来了。

下面修改ViewGroup2触摸事件拦截方法的标志位并且截图Log日志

总结2:在触摸事件传递的过程中,如果遇到了一个onInterceptTouchEvent返回true,那么表示不再往下传,直接从此View的onTouchEvent返回。

然而,我们发现只有ACTION_DOWN事件传进来了,其他类型的触摸都不会进来了,原因是在所有的onTouchEvent中都返回了false,也就是他们都表示不会去处理这一次的触摸事件,所以系统就不会自作多情再传触摸事件进来了。

要想系统不断的传递触摸事件进来,只能在某一个onTouchEvent中返回true,修改ViewGroup2的onTouchEvent标志位并截图Log日志

总结3:当某个onTouchEvent返回true并且触摸事件传递到这个方法时,表示自己要处理这个触摸事件,不再向上传递;后来的其他类型的触摸事件还是会走一下onInterceptTouchEvent(但不会走到已经在处理触摸事件的View以及之后的View的onInterceptTouchEvent),然后再传给正在处理触摸事件的View的onTouchEvent方法,并且此时也不会再向上传递。

所以我们可以得到一些非常宝贵并且非常常用的技巧:

1、在onTouchEvent中处理我们需要做的触摸事件,并且返回true。

2、在onInterceptTouchEvent中获取ACTION_DOWN、ACTION_MOVE、ACTION_UP等触摸事件(可能只是获取其中一两种触摸事件),然后判断是否满足拦截的条件,在此之前返回false,一旦满足则返回true。

源代码下载:

转载于:https://my.oschina.net/u/1773742/blog/633994

你可能感兴趣的文章
小学生学“数学”
查看>>
【Vue】组件使用之参数校验
查看>>
FastDFS蛋疼的集群和负载均衡(十七)之解决LVS+Keepalived遇到的问题
查看>>
深入剖析Redis系列(二) - Redis哨兵模式与高可用集群
查看>>
Android 用于校验集合参数的小封装
查看>>
iOS混合开发库(GICXMLLayout)七、JavaScript篇
查看>>
instrument 调试 无法指出问题代码 解决
查看>>
理解缓存
查看>>
im也去中心化?Startalk(星语)的去中心化设计之路
查看>>
BAT 经典算法笔试题 —— 磁盘多路归并排序
查看>>
一次完整的HTTP请求
查看>>
Nginx限制带宽
查看>>
All Web Application Attack Techniques
查看>>
归档日志ORA-19809: 超出了恢复文件数的限制
查看>>
精品德国软件 UltraShredder 文件粉碎机
查看>>
PANDAS 数据合并与重塑(join/merge篇)
查看>>
文件时间信息在测试中的应用
查看>>
Exception loading sessions from persistent storage (tomcat异常)
查看>>
直播疑难杂症排查(8)— 播放杂音、噪音、回声问题
查看>>
如何写gdb命令脚本
查看>>