布局为:<viewgroupA
ViewGroupB
MyView>
没有截断时:
因为没有消费事件,所以后续的action_up和action_move都不会处理。
ViewGroupB 截断:
viewgroupB截断且消费了:
注意后续的action down和action move事件并不会执行 MyViewGroupB的onInterceptTouchEvent
viewgroupB截断不消费,viewgroupA消费:则后续的action move 和action up直接传给MyViewGroupA,谁消费了,后续的事件就直接传给他了
viewgroupB截断,但是viewgroupA和viewgroupB都没有消费事件,最终会在activity中ontouchevent中处理事件
结论:
1、事件从 Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的 View(ViewGroup)开始一直往下(子 View)传递。子 View 可以通过 onTouchEvent()对事件进行处理。
2、事件由父 View(ViewGroup)传递给子 View,ViewGroup 可以通过 onInterceptTouchEvent()对事件做拦截,停止其往下传递。
3、三个方法执行顺序dispatchTouchEvent -> onInterceptTouchEvent -> onTouchEvent
4、只要该控件消费了事件,后续的Action move 和up都会直接传到该控件的ontouchevent(反之不会),此时会执行该控件的dispatchTouchEvent 和onTouchEvent,onInterceptTouchEvent 不会被执行
5、如果没有一个控件消费事件,事件最终会在activity中被消费