Android事件分发源码流程
分发流程
Activity分发源码流程图
ViewGroup分发源码流程图
ViewGroup:dispatchTouchEvent
只做了三件事:
1、去判断是否需要拦截事件
2、在当前ViewGroup中找到用户真正点击的View
3、分发事件到View上
View分发源码流程图
事件的来源
触摸信息是如何到达viewRootImpl的?
咱们都知道的是,在咱们手指触摸屏幕时,即产生了触摸信息。这个触摸信息由屏幕这个硬件产生,被系统底层驱动获取,交给Android的输入系统服务:InputManagerService,也就是IMS。
IMS会对这个触摸信息进行处理,经过WMS找到要分发的window,随后发送给对应的viewRootImpl。因此发送触摸信息的并非WMS,WMS提供的是window的相关信息。
当viewRootImpl接收到触摸信息时,也正是应用程序进程事件分发的开始。
viewRootImpl是如何分发事件的?
1、viewRootImpl会直接调用管理的view的 dispatchTouchEvent 方法,根据具体的view的类型,调用具体的方法。
2、view树的根view多是一个view,也多是一个viewGroup,view会直接处理事件,而viewGroup则会进行分发。
3、DecorView重写了 dispatchTouchEvent 方法,会先判断是否存在callBack,优先调用callBack的方法,也就是把事件传递给了Activity。
4、其余的viewGroup子类会根据自身的逻辑进行事件分发。
所以,触摸事件必定是从Activity开始的吗?不是,Activity只是其中的一种状况,只有Activity本身负责的那一棵view树,才必定会到达activity,而其余的window,则不会通过Activity。触摸事件是从viewRootImpl开始,而不是Activity。
总结
1、IMS从系统底层接收到事件以后,会从WMS中获取window信息,并将事件信息发送给对应的viewRootImpl
2、viewRootImpl接收到事件信息,封装成motionEvent对象后,发送给管理的view
3、iew会根据自身的类型,对事件进行分发仍是本身处理
4、顶层viewGroup通常是DecorView,DecorView会根据自身callBack的状况,选择调用callBack或者调用父类ViewGroup的方法
对你有帮助的其他参考文章:
Android全面解析之Window机制
https://juejin.cn/post/6888688477714841608
Android事件分发机制一:事件是如何到达activity的?
https://www.shangmayuan.com/a/5709df5f4765468ebe0903ee.html