Android事件分发分析
流程概括
- 输入事件由FrameWork层发送到
ViewRootImpl
的内部类WindowInputEventReceiver
上,根据InputEvent
的类型,进行不同的分发方式。 - 如果是
TouchEvent
,ViewRootImpl
调用其保存的View.dispatchTouchEvent()
方法,这个View
一般是DecorView
,如果是悬浮窗一类的直接是WindowManagerGlobal.addView()
的那个View
DecorView
首先将该事件交由Window
中的callback
进行处理,也就是Activity
或Dialog
Activity
然后在交由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
结束本次事件。