之前对安卓触摸事件分发只是大概的理解一下,现在已经有了更深入的理解,这篇博客要重新写过,等过段事件重新写
布局:Activity => ViewGroup => View
所有方法return super代表不做处理。
所有方法return true代表已消费,事件中止,不再传递。
dispatchTouchEvent()事件分发,return super为不处理(分发),true为不分发,false为不分发。
onInterceptTouchEvent()事件拦截,return super为不处理(不拦截),true为拦截,false为不拦截。
onTouchEvent()事件处理,return super为不处理(继续传递),true为中止,false为继续传递。
事件传递:
Activity.dispatchTouchEvent()
ViewGroup.dispatchTouchEvent()
ViewGroup.onInterceptTouchEvent()
View.dispatchTouchEvent()
如果调用了view.setOnTouchListener(listener),则先调用listener.onTouch()
View.onTouchEvent()
ViewGroup.onTouchEvent()
Activity.onTouchEvent()
+++++++++++++++++++++++++++++++++++++++++
想要进一步提升开发水平,事件分发机制是绕不开的。
网上也又各种博客分析源码,我也是看得一半一半懂,其实都是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
。
实用的实践例子
如有错误,欢迎指出,及时更正,不误后来子弟。