一.三个关键方法
1.dispatchTouchEvent(MotionEvent ev)
所有的view的事件分发都是由这一个方法开始,一般当前view开始接受点击事件的时候,都会最先开始调用这个方法。
返回值代表当前的view是否被消耗,主要基于onTouchEvent()
2.onInterceptTouchEvent(MotionEvent event)
只有ViewGroup才有,用于做判断当前ViewGroup是否拦截方法的标志。如果返回true,那么当前view被拦截,如果返回false。那么当前ViewGroup不拦截点击事件。
3.onTouchEvent(MotionEvent event)
事件的真正消耗的位置,返回true,代表当前view消耗事件,返回false不消耗当前事件。
二.事件传递的基本流程
Activity -----> ViewGroup(父View)----> View(子View)
1>事件未被消费流程
2>点击事件被指定view消费
2.1>down被消费后续的up和move事件(不被父ViewGroup拦截)
2.2>down被消费后续的up和move事件(被父viewGroup拦截)
3>down一开始被拦截
4>总结
(1)事件从Activity的dispatcher开始传递,从上层的viewgroup开始一直向下传递到子view。而子view的onTouchEvent可以进行拦截(通过返回true)。
(2)ViewGroup可以通过onInterceptTouchEvent进行拦截。拦截后降不再向下传递。
(3)如果传到底层的view,一直没有被onTouchEvent消费的话,会继续往上传递,直到Activity的onTouchEvent
(4)如果down事件没有被消费。那么后续的其他up和move事件不会被传递。
(5)onTouchEvent优先于onTouchEvent,onClickListener优先级低于onTouchEvent
5>其他
之前学设计模式的时候,讲到责任链模式,而事件分发机制是典型的责任链模式。有兴趣的小伙伴可以把责任链设计模式也一起学了。