图解
如下图,分为3层,从上往下依次是Activity、ViewGroup、View。
事件从Activity的dispatchTouchEvent分发,箭头的上面字代表方法返回值。
touch事件分发核心
View 之间的事件分发,实质上就是一个大的递归函数,而这个递归函数就是 dispatchTouchEvent 方法。在这个递归的过程中,如果含有ViewGroup,会实时调用 onInterceptTouchEvent 来拦截事件,或者调用 onTouchEvent 方法来处理事件。
注意
1、ACTION_DOWN事件在哪个控件消费了(return true), 那么ACTION_MOVE和ACTION_UP就会从上往下(通过dispatchTouchEvent)做事件分发往下传,就只会传到这个控件,不会继续往下传。
如果ACTION_DOWN事件是在dispatchTouchEvent消费,那么事件到此为止停止传递。
如果ACTION_DOWN事件是在onTouchEvent消费的,那么会把ACTION_MOVE或ACTION_UP事件传给该控件的onTouchEvent处理并结束传递。
2、CANCEL 事件的触发场景:当父视图先不拦截,然后在 MOVE 事件中重新拦截,此时子 View 会接收到一个 CANCEL 事件。
3、View的事件三个点击方法的执行顺序onTouch()>onTouchEvent()>onClick()