应用层的知识归纳看看

Android 事件分发机制详解

2018-10-25  本文已影响62人  KT_11
目录

1 完整流程图

下图就是完整的事件分发流程


2 具体分析

由于上面这张图太大,下面暂时用一张简化版的图代替,以便于我们分析
OK,我们开始!

2-1 要点

请记住以下的结论,当然我们会过一遍,然后帮助我们在理解中记忆

1 如果事件不被中断,整个事件流向是一个类U型图

2 dispatchTouchEvent 和 onTouchEvent 一旦return true,事件就停止传递了,我们可以理解为事件被消费了,消费了的意思就是事件走到这里就是终点,不会往下传,没有谁能再收到这个事件了

3 dispatchTouchEvent 和 onTouchEvent 都return false的时候事件都回传给父控件的onTouchEvent处理

4 dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent
ViewGroup 和View的这些方法的默认实现就是会让整个事件安装U型完整走完,所以 return super.xxxxxx() 就会让事件依照U型的方向的完整走完整个事件流动路径),中间不做任何改动,不回溯、不终止,每个环节都走到

5 onInterceptTouchEvent的作用


2-2 总结

最后总结一下:


2-3 关于ACTION_MOVE 和 ACTION_UP

1、我们在ViewGroup1 的dispatchTouchEvent 方法返回true消费这次事件

Activity | dispatchTouchEvent --> ACTION_MOVE 
ViewGroup1 | dispatchTouchEvent --> ACTION_MOVE
----
TouchEventActivity | dispatchTouchEvent --> ACTION_UP 
ViewGroup1 | dispatchTouchEvent --> ACTION_UP
----

下图中
红色的箭头代表ACTION_DOWN 事件的流向
蓝色的箭头代表ACTION_MOVE 和 ACTION_UP 事件的流向


2、接着我们在ViewGroup2 的dispatchTouchEvent 返回true消费这次事件
红色的箭头代表ACTION_DOWN 事件的流向
蓝色的箭头代表ACTION_MOVE 和 ACTION_UP 事件的流向


3、我们在View 的dispatchTouchEvent 返回true消费这次事件
这里就不赘述了,和第二个例子几乎一模一样

我们可以得出结论如果在某个控件的dispatchTouchEvent 返回true消费终结事件,那么如果能收到ACTION_DOWN 的事件,那么也能收到 ACTION_MOVE和ACTION_UP事件

再看另一种情况

4、我们在View 的onTouchEvent 返回true消费这次事件
红色的箭头代表ACTION_DOWN 事件的流向
蓝色的箭头代表ACTION_MOVE 和 ACTION_UP 事件的流向

5、我们在ViewGroup 2 的onTouchEvent 返回true消费这次事件
红色的箭头代表ACTION_DOWN 事件的流向
蓝色的箭头代表ACTION_MOVE 和 ACTION_UP 事件的流向

6、我们在ViewGroup 1 的onTouchEvent 返回true消费这次事件
红色的箭头代表ACTION_DOWN 事件的流向
蓝色的箭头代表ACTION_MOVE 和 ACTION_UP 事件的流向

我们可以发现,在哪个View的onTouchEvent 返回true,那么ACTION_MOVE和ACTION_UP的事件从上往下传到这个View后就不再往下传递了,而直接传给自己的onTouchEvent 并结束本次事件传递过程。

还有其他几种也属于和上面类似的情况......

最后我们得出结论:


参考致谢:

https://www.jianshu.com/p/e99b5e8bd67b
https://blog.csdn.net/ezview_uniview/article/details/77619900#commentBox

上一篇下一篇

猜你喜欢

热点阅读