Android事件分发机制--->ACTION_UP事件
引言
在文章一步步探索学习Android Touch事件分发传递机制(二)中我们可以练习到ACTION_UP事件的事件分发传递流程是怎样的,因为UP事件发生前肯定有DOWN事件,所以UP事件的分发流程肯定与DOWN事件在哪被消费是紧密相关的。可以继续用上一篇文章Android事件分发机制--->DOWN事件中的demo为例子,打印log,来探索UP事件的分发流程。
1. 布局&代码
和Android事件分发机制--->DOWN事件中用到的一样。
2. 打印log
(1) 所有方法返回super的情况
-
log
-
对应的流程图
所有方法返回super
总结:ACTION_UP事件并没有和ACTION_DOWN事件一样类似U型的结构在View树传递,而是直接在Activity的onTouchEvent方法中消费掉了。
(2) ViewGroup2的dispatchTouchEvent()返回true的情况
-
log
dispatchTouchEvent()返回true -
对应的流程图
dispatchTouchEvent()返回true
总结:当ACTION_DOWN事件在某一个View或者ViewGroup的dispatchTouchEvent()方法中被消费调的情况下,对应的ACTION_UP事件也会在次被消费掉,终止传递。
(3) ViewGroup2的onInterceptTouchEvent()和onTouchEvent都返回true的情况
-
log
-
对应的流程图
onInterceptTouchEvent()和onTouchEvent都返回true
总结:当ACTION_DOWN事件在某一个View或者ViewGroup的onTouchEvent方法中被消费掉的情况下,对应的ACTION_UP事件也会再次被消费掉,终止传递。(需要注意的是,ACTION_UP事件是不会再经过拦截器onInterceptTouchEvent()方法了的)
(3) ViewGroup2的onTouchEvent返回true的情况
-
log
ViewGroup2的onTouchEvent返回true -
对应的流程图
ViewGroup2的onTouchEvent返回true的情况
总结:可以从Log看出来,当ACTION_DOWN事件被某控件的onTouchEvent方法消费掉,则其对应的ACTION_UP事件只传递到该控件。也就是不会传递到比此空间更深层的控件中去。
3.最后总结
- ACTION_MOVE事件与ACTION_UP事件遵循类似的规律,上面只以ACTION_UP为例子分析。
- ACTION_MOVE事件与ACTION_UP事件的传递分发与其对应之前的ACTION_DOWN事件有紧密联系。
- 当ACTION_DOWN事件在dispatchTouchEvent方法中被消费,则对应的ACTION_MOVE事件与ACTION_UP事件也会从上而下传递到该控件的该方法处被消费掉。
- 当ACTION_DOWN事件在onTouchEvent方法中被消费,则对应的ACTION_MOVE事件和ACTION_UP事件只传递到该控件的onTouchEvent方法中然后被消费而终止传递,不会经历该控件之下的控件的传递过程。
- 当所有方法都默认return super,则ACTION_MOVE事件与ACTION_UP事件会在Activity的onTouchEvent()中被消费掉。
值得学习的文章: