Android 事件分发机制介绍

一.三个关键方法

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>事件未被消费流程

点击事件不被消费.jpg

2>点击事件被指定view消费

点击事件被指定view消费.jpg

2.1>down被消费后续的up和move事件(不被父ViewGroup拦截)

点击事件up和move不被父viewGroup拦截.jpg

2.2>down被消费后续的up和move事件(被父viewGroup拦截)

up和move的后续(被父viewGroup)拦截.jpg

3>down一开始被拦截

down一开始被父view拦截.jpg

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>其他

之前学设计模式的时候,讲到责任链模式,而事件分发机制是典型的责任链模式。有兴趣的小伙伴可以把责任链设计模式也一起学了。

你可能感兴趣的:(Android 事件分发机制介绍)