View事件传递示例

150 阅读2分钟

所有示图:

      红色的箭头代表ACTION_DOWN 事件的流向
      蓝色的箭头代表ACTION_MOVE 和 ACTION_UP 事件的流向

总结:

(1)对于在onTouchEvent消费事件的情况:在哪个View的onTouchEvent 返回true,那么ACTION_MOVE和ACTION_UP的事件从上往下传到这个View后就不再往下传递了,而直接传给自己的onTouchEvent 并结束本次事件传递过程。

(2)对于ACTION_MOVE、ACTION_UP总结:ACTION_DOWN事件在哪个控件消费了(return true), 那么ACTION_MOVE和ACTION_UP就会从上往下(通过dispatchTouchEvent)做事件分发往下传,就只会传到这个控件,不会继续往下传

(3)如果ACTION_DOWN事件是在dispatchTouchEvent消费,那么事件到此为止停止传递

(4)如果ACTION_DOWN事件是在onTouchEvent消费的,那么会把ACTION_MOVE或ACTION_UP事件传给该控件的onTouchEvent处理并结束传递。

(5)如果在某个控件的dispatchTouchEvent 返回true消费终结事件,那么收到ACTION_DOWN 的函数也能收到 ACTION_MOVE和ACTION_UP。


1、ViewGroup1 的dispatchTouchEvent 方法返回true消费这次事件

ACTION_DOWN 事件从(Activity的dispatchTouchEvent)--------> (ViewGroup1 的dispatchTouchEvent) 后结束传递,事件被消费

2、ViewGroup2 的dispatchTouchEvent 返回true消费这次事件

3、View 的onTouchEvent 返回true消费这次事件

4、ViewGroup 2 的onTouchEvent 返回true消费这次事件


5、ViewGroup 1 的onTouchEvent 返回true消费这次事件

6、Activity 的onTouchEvent 返回true消费这次事件

7、View的dispatchTouchEvent 返回false并且Activity 的onTouchEvent 返回true消费这次事件

8、View的dispatchTouchEvent 返回false并且ViewGroup 1 的onTouchEvent 返回true消费这次事件

9、View的dispatchTouchEvent 返回false并且在ViewGroup 2 的onTouchEvent 返回true消费这次事件

10、ViewGroup2的dispatchTouchEvent 返回false并且在ViewGroup1 的onTouchEvent返回true消费这次事件

11、ViewGroup2的onInterceptTouchEvent 返回true拦截此次事件并且在ViewGroup 1 的onTouchEvent返回true消费这次事件。