天天看点

Android 事件分发机制总结

View和ViewGroup的事件回调方法

View有dispatchTouchEvent,onTouchEvent

ViewGroup有dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent

DispatchTouchEvent的作用

dispatchTouchEvent负责事件的分发,调用super.dispatchTouchEvent才会往下传递事件。

View的DispatchTouchEvent方法的默认实现就是去调用onTouchEvent,将事件分发给自己处理。

ViewGroup的DispatchTouchEvent方法的默认实现就是去调用onInterceptTouchEvent,来判断是否拦截事件。

当dispatchTouchEvent返回True时:事件停止传递,没继续往下传递,事件被消费了。

当dispatchTouchEvent返回False时:回传给父控件的onTouchEvent处理。事件停止往子View传递和分发,同时开始往父控件回传(父控件的onTouchEvent开始从下往上回传直到某个onTouchEvent return True),

事件分发机制就像递归,return False的意思就是递归停止然后开始回传。

onInterceptTouchEvent的作用

onInterceptTouchEvent负责事件的拦截,在每个ViewGroup的dispatchTouEvent的分发过程中会调用onInterceptTouchEvent来判断是否拦截事件,让自己的onTouchEvent来消费处理。

当onInterceptTouchEvent返回True时:拦截事件,交给自己的onTouchEvent处理,事件被消费了。

当onInterceptTouchEvent返回False时:不拦截事件,事件继续往子控件往下传。

onTouchEvent的作用

onTouchEvent负责事件的消费处理,事件的业务逻辑处理在这里执行。

当onTouchEvent返回True时:事件停止传递,事件被消费了。

当onTouchEvent返回False时:事件不处理,回传给父控件的onTouchEvent处理。不消费事件,并让事件继续往父控件的方向从下往上传递。

super的默认实现

ViewGroup:

super.dispatchTouchEvent方法的默认实现就是去调用onInterceptTouchEvent,通过Intercept把事件拦截下来,分发到自己的onTouchEvent处理。

onInterceptTouchEvent 默认是不拦截的, super.onInterceptTouchEvent ()==false

View:

super.dispatchTouchEvent方法的默认实现就是把事件分发给自己的onTouchEvent处理。

View,ViewGroup:

super.onTouchEvent默认是返回false,不消费事件。

ACTION_MOVE和ACTION_UP总结

对于在onTouchEvent消费事件的情况:在哪个View的onTouchEvent返回True,那么ACTION_MOVE和ACTION_UP的事件从上往下传递到这个View后就终结传递了,不再往下传递了,而是直接传给该view的onTouchEvent处理消费并结束本次事件传递过程。

ACTION_DOWN事件是在哪个控件被消费了(return True),那么ACTION_MOVE和ACTION_UP就会从上往下(通过DispatchTouchEvent)做事件分发往下传,就只会传到这个控件,不会继续往下传,如果ACTION_DOWN事件是在DispatchTouchEvent消费,那么事件到此为止停止传递,如果ACTION_DOWN事件是在onTouchEvent消费的,那么会把ACTION_MOVE或ACTION_UP事件传给该控件的onTouchEvent处理并终止传递。

注:消费的意思就是事件走到这里就是终点了,不会继续往下传,没有谁能再收到这个事件了。

Android 事件分发机制总结
Android 事件分发机制总结