Android事件分发的本质
将点击事件(MotionEvent)传递到某个具体的View并且处理的整个过程
Android事件分发的过程由哪些方法协作完成
dispatchTouchEvent()
onInterceptTouchEvent()
onTouchEvent()
Android事件分发的顺序
Activity–> ViewGroup–>View
需要注意的是:onTouch()执行总是优先于onClick()
Activity中的事件分发
每一个Activity 都持有一个Window对象(getWindow()获取)
而Window是一个抽象类,唯一的实现是PhoneView。
PhoneView持有一个DecorView实例继承自FrameLayout,FrameLayout继承自ViewGroup。
所以说Activity持有的最顶层的view为DecorView。
DecorView中调用的父类的**dispatchTouchEvent()**方法,具体的方法实现位于ViewGroup,至此Activity传出的触摸事件被分发到ViewGroup。
ViewGroup中的事件分发
- 首先判断是否需要拦截事件
判断安全策略:view是否在顶部 是否被遮挡 是否设置不在顶部不响应点击事件
判断触摸事件 :ACTION_DOWN
- 若不拦截则在当前的viewgroup中找到用户点击的View(遍历View子树)
- 通过**dispatchTouchEvent()**将事件分发给view
View中的事件分发
同一个事件序列,如果子View(ViewGroup)第一次没有处理(消费)该事件,则后续事件就不会再传递到子View中
在**onTouchEvent()**方法中 return true代表消费该事件,retrun false 代表事件未消费 则事件继续向下传递