Android事件分发之前做了啥?
谈到Android事件分发机制问题,大家肯定都是在熟悉不过,Android体系中的常用知识,也是面试中经常被关注的问题,我也经常被问到,以前被问事件分发机制,我都是这样回答:
-
ViewGroup中有
dispatchTouchEvent
,onInterceptTouchEvent
,onTouchEvent
三个方法,可以分发,拦截,消费事件,而View中只有dispatchTouchEvent
,onTouchEvent
两个方法,不能做拦截处理。 -
事件分发–从父级向子级传递的,事件消费–从子级父级传递的。
-
然后再补一张分发流程图。挥笔画图一张,边画别说…
吧嗒吧嗒吧嗒…
好几次的时候,我自己都佩服自己,真的厉害的不行,巴拉巴拉的口水满天飞,都不带停顿的,讲一遍比一遍熟,感觉自己真TM的已经把事件分发机制研究的完全透彻了一样。
但是实际捏,我自己很了解,忽悠归忽悠,其实自己有几斤几两,自己还是非常清楚。
但是,事件分发的文章,大佬们已经写了很多了,主体讲的就是从父级子级传递,子级父级传递消费的主体部分
,
小子这里写一些不一样的东西,这里主要讲主体部分之前的部分流程!
用户操作事件,先走DecorView
的dispatchTouchEvent
,获取callback对象,调用cb.dispatchTouchEvent
方法
Activity默认实现了Window.Callback,所以就调用的是activity
的dispatchTouchEvent
方法,然后里面再调用window.superDispatchTouchEvent
phoneWindow是Window的唯一实现类,getWindow即为phoneWindow
phoneWindow里面再调用图一的DecorView的superDispatchTouchEvent
方法,然后就调用到ViewGroup的dispatchEvent分发事件了
后面的部分就是大佬们的ViewGoup-view的主体事件分发流程了,借用一张图(如果侵权就里面删掉
)