Android View事件传递机制(一)
需要明确的事情
- 用户的一次点击,会产生一个事件序列,也就是多次调用事件方法的函数。具体的说就是:一次
ACTION_DOWN
的事件、多个ACTION_MOVE
的事件、 一个ACTION_UP
的事件。 我们可以将传递过程分为两个部分,第一部分为 是否往分发事件的传递,其过程为:由父
view
向子view
传递(也就是dispatchTouchEvent
方法); 第二部分为 是否处理事件的传递,其过程为:由子view
向父view
传递(也就是onTouchEvent
)。onInterceptTouchEvent
方法决定了第一个传递过程到哪一层结束,同时,第二个传递也就相应从这一场开始。ACTION_DOWN
的事件相当于首先去寻找处理该事件的view
,如果找到了,之后的事件会直接传递给该view
,否则,之后的事件直接由最外层的Activity
处理了。
具体的情形
注意,这里说的是down
的事件。
如果
View
或ViewGroup
在dispatchTouchEvent
返回true
,那么该事件的传递结束,并且之后的事件序列都会只调用到该dispatchTouchEvent
方法,然后结束。(不会再调用自己的onInterceptTouchEvent
和onTouchEvent
方法了。)如果
View
或ViewGroup
在onInterceptTouchEvent
返回true
,那么会调用自己的onTouchEvent
方法,并且继续向上传递,调用父view
的onTouchEvent
,直到找到一个onTouchEvent
返回为true
时停止。之后的事件就会直接传到这个onTouchEvent
方法中。(之注意,之后的事件不会再调用到onInterceptTouchEvent
方法)。如果
View
或ViewGroup
在onTouchEvent
返回true
,是否处理事件的传递就会到此结束,不会再想起父view
传递,而且之后的事件序列也就直接传到该view的onTouchEvent
方法。
以上,就是view 的事件传递的宏观上的描述。可能描述的不够清楚,如果有兴趣的话,最好自己写个demo,简单的修改返回值,来进行相应的测试。只有知道了其宏观表现,对于继续深入研究时,才不会盲目不知所措。
在这一部分,主要是参考了《Android 群英会》和《Android开发艺术探索》。
以上是自己简单总结,之后会结合源码在进一步分析。