传递流程
Activity -> PhoneWindow -> DecorView -> ViewGroup -> View
三大事件
1.dispatchTouchEvent
2.onInterceptTouchEvent
Activity 和View 都没有此方法,因为Activity将事件传递给了PhoneWindow-> DecorView 由DecorView来分发
而View是因为没有子View不需要拦截
3.onTouchEvent
所有人都不处理
D/Activity: dispatchTouchEvent 0
D/MyViewGroup: dispatchTouchEvent 0
D/MyViewGroup: onInterceptTouchEvent 0
D/MyView: dispatchTouchEvent 0
D/MyView: onTouchEvent 0
D/MyViewGroup: onTouchEvent 0
D/Activity: onTouchEvent 0
D/Activity: dispatchTouchEvent 2
D/Activity: onTouchEvent 2
D/Activity: dispatchTouchEvent 1
D/Activity: onTouchEvent 1
中间层拦截了
中间层不消费
D/Activity: dispatchTouchEvent 0
D/MyViewGroup: dispatchTouchEvent 0
D/MyViewGroup: onInterceptTouchEvent 0
D/MyViewGroup: onTouchEvent 0
D/Activity: onTouchEvent 0
D/Activity: dispatchTouchEvent 2
D/Activity: onTouchEvent 2
D/Activity: dispatchTouchEvent 1
D/Activity: onTouchEvent 1
中间层消费
D/Activity: dispatchTouchEvent 0
D/MyViewGroup: dispatchTouchEvent 0
D/MyViewGroup: onInterceptTouchEvent 0
D/MyView: dispatchTouchEvent 0
D/MyView: onTouchEvent 0
D/MyViewGroup: onTouchEvent 0
D/Activity: dispatchTouchEvent 2
D/MyViewGroup: dispatchTouchEvent 2
D/MyViewGroup: onTouchEvent 2
D/Activity: dispatchTouchEvent 1
D/MyViewGroup: dispatchTouchEvent 1
D/MyViewGroup: onTouchEvent 1
可以看到ViewGroup 后续的事件没有在执行onInterceptTouchEvent
,说明实在dispatchTouchEvent时已经决定了不再下发。
View层消费
D/Activity: dispatchTouchEvent 0
D/MyViewGroup: dispatchTouchEvent 0
D/MyViewGroup: onInterceptTouchEvent 0
D/MyView: dispatchTouchEvent 0
D/MyView: onTouchEvent 0
D/Activity: dispatchTouchEvent 2
D/MyViewGroup: dispatchTouchEvent 2
D/MyViewGroup: onInterceptTouchEvent 2
D/MyView: dispatchTouchEvent 2
D/MyView: onTouchEvent 2
D/Activity: dispatchTouchEvent 1
D/MyViewGroup: dispatchTouchEvent 1
D/MyViewGroup: onInterceptTouchEvent 1
D/MyView: dispatchTouchEvent 1
D/MyView: onTouchEvent 1
ViewGroup 和 View 同时想消费,例如同时设置了点击事件
此时逻辑是如果ViewGroup没有拦截 ,那么就会先分发 给子View,child会消费调此次事件 ,但同一动作的接下来的事件,也是同样的会经过ViewGroup分发。
D/Activity: dispatchTouchEvent 0
D/MyViewGroup: dispatchTouchEvent 0
D/MyViewGroup: onInterceptTouchEvent 0
D/MyView: dispatchTouchEvent 0
D/MyView: onTouchEvent 0
D/Activity: dispatchTouchEvent 1
D/MyViewGroup: dispatchTouchEvent 1
D/MyViewGroup: onInterceptTouchEvent 1
D/MyView: dispatchTouchEvent 1
D/MyView: onTouchEvent 1