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处理并终止传递。
注:消费的意思就是事件走到这里就是终点了,不会继续往下传,没有谁能再收到这个事件了。