想要进一步提升开发水平,事件分发机制是绕不开的。
网上也又各种博客分析源码,我也是看得一半一半懂,其实都是Java源码,慢慢看多几遍还是能看懂的,没有这个自信就不是程序员了。
这篇博客不写源码,不写分析,仅仅是总结出Touch事件的分发流程。
需要知道的东西
dispatchTouchEvent:分发事件。这个方法和事件分发机制密不可分,但这里不说这个。onInterceptTouchEvent:拦截事件。继承此方法,返回true,表示拦截了此事件。onTouchEvent:监听事件。继承此方法,处理事件,返回true表示消费了此事件。View是没有onInterceptTouchEvent方法的
假设界面
这里假设我们有一个如下图一样的界面,在Activity中有一个ViewGroup1,嵌套着ViewGroup2,最上层是个View。当然那些DecorView、FrameLayout什么的就不说了。看图:

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

下面的描述只需要看一遍,理解了就行,然后上面这个图就会自动留在你的脑海中了,好简单的图。
- 用户按下屏幕,滑动一下,再松开手,会发出一些列的事件:
DOWN-MOVE-MOVE...-UP,这里主要说DOWN事件。 - Activity首先会把
DOWN事件分发给最底层的ViewGroup1的onInterceptTouchEvent方法。 onInterceptTouchEvent,继承并返回true,表示拦截此事件,不再传递下去;返回false,表示不拦截,事件直接传递给下一个ViewGroup的onInterceptTouchEvent方法。onTouchEvent,继承并返回true,表示消费了此事件,不再传递下去;返回false,表示没有消费,继续传递下去给别的View处理。
注意:
如果一直没有
View消费DOWN事件,则后面的MOVE、UP事件就不会再触发了。
比如上面的例子,如果ViewGroup1、ViewGrouip2和View的onTouchEvent都返回false的话,那么只会触发DOWN事件,后面的UP事件将不会收到了。
如果某个
ViewGroup消费了DOWN事件,则后续的事件会把此ViewGroup当初View,也就是忽略它的onInterceptTouchEvent。
比如上面的例子,如果ViewGroup2的onTouchEvent返回true,则后面的UP事件会忽略ViewGroup2的onInterceptTouchEvent,会变成:ViewGroup1.onInterceptTouchEvent -> ViewGroup2.onTouchEvent。
实用的实践例子
如有错误,欢迎指出,及时更正,不误后来子弟。
Touch事件分发流程解析
本文解析了Android中Touch事件的分发流程,包括dispatchTouchEvent、onInterceptTouchEvent及onTouchEvent的作用与交互方式,并通过实例说明了事件如何在Activity、ViewGroup及View之间传递。
2118

被折叠的 条评论
为什么被折叠?



