Android事件分发分析
流程概括
- 输入事件由FrameWork层发送到
ViewRootImpl的内部类WindowInputEventReceiver上,根据InputEvent的类型,进行不同的分发方式。 - 如果是
TouchEvent,ViewRootImpl调用其保存的View.dispatchTouchEvent()方法,这个View一般是DecorView,如果是悬浮窗一类的直接是WindowManagerGlobal.addView()的那个View DecorView首先将该事件交由Window中的callback进行处理,也就是Activity或DialogActivity然后在交由Window也就是PhoneWindow处理PhoneWindow在交由内部保存的DecorView进行处理DecorView使用ViewGroup分发逻辑向下分发。ViewGroup首先判断自身是否拦截事件,如果onInterceptTouchEvent返回true,则自身消费事件。- 如果不拦截,则将子
View按z-order的顺序排序,根据MotionEvent的x、y寻找子View,将事件分发给它们。 - 如果子
View是ViewGroup,则同样继续分发给子View, - 如果子
View是View,那么通过判断mOnTouchListener或onTouchEvent的返回值看是否事件消费 - 如果所有的子
View都没有消费这个事件,则事件向上返回,由父ViewGroup决定自身是否消费。 - 最终
Activity、Window都不消费,则ViewRootImpl调用finishInputEvent结束本次事件。