安卓Touch事件的分发流程

Touch事件分发流程解析
本文解析了Android中Touch事件的分发流程,包括dispatchTouchEvent、onInterceptTouchEvent及onTouchEvent的作用与交互方式,并通过实例说明了事件如何在Activity、ViewGroup及View之间传递。

想要进一步提升开发水平,事件分发机制是绕不开的。
网上也又各种博客分析源码,我也是看得一半一半懂,其实都是Java源码,慢慢看多几遍还是能看懂的,没有这个自信就不是程序员了。
这篇博客不写源码,不写分析,仅仅是总结出Touch事件的分发流程。

需要知道的东西

  • dispatchTouchEvent:分发事件。这个方法和事件分发机制密不可分,但这里不说这个。
  • onInterceptTouchEvent:拦截事件。继承此方法,返回true,表示拦截了此事件。
  • onTouchEvent:监听事件。继承此方法,处理事件,返回true表示消费了此事件。
  • View是没有onInterceptTouchEvent方法的

假设界面

这里假设我们有一个如下图一样的界面,在Activity中有一个ViewGroup1,嵌套着ViewGroup2,最上层是个View。当然那些DecorView、FrameLayout什么的就不说了。看图:
界面大致布局.png

分发流程

分发流程用一个图来说明,看:

事件分发流程.png

下面的描述只需要看一遍,理解了就行,然后上面这个图就会自动留在你的脑海中了,好简单的图。

  • 用户按下屏幕,滑动一下,再松开手,会发出一些列的事件:DOWN-MOVE-MOVE...-UP,这里主要说DOWN事件。
  • Activity首先会把DOWN事件分发给最底层的ViewGroup1onInterceptTouchEvent方法。
  • onInterceptTouchEvent,继承并返回true,表示拦截此事件,不再传递下去;返回false,表示不拦截,事件直接传递给下一个ViewGrouponInterceptTouchEvent方法。
  • onTouchEvent,继承并返回true,表示消费了此事件,不再传递下去;返回false,表示没有消费,继续传递下去给别的View处理。

注意:

如果一直没有View消费DOWN事件,则后面的MOVEUP事件就不会再触发了。

比如上面的例子,如果ViewGroup1ViewGrouip2ViewonTouchEvent都返回false的话,那么只会触发DOWN事件,后面的UP事件将不会收到了。

如果某个ViewGroup消费了DOWN事件,则后续的事件会把此ViewGroup当初View,也就是忽略它的onInterceptTouchEvent

比如上面的例子,如果ViewGroup2onTouchEvent返回true,则后面的UP事件会忽略ViewGroup2onInterceptTouchEvent,会变成:ViewGroup1.onInterceptTouchEvent -> ViewGroup2.onTouchEvent

实用的实践例子

禁止滑动的ViewPager

如有错误,欢迎指出,及时更正,不误后来子弟。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值