总结一下:
- 事件序列的定义:从手触摸屏幕(含)到离开屏幕(含)期间所发生的一系列交互事件。
主要由ACTION_DOWN、ACTION_MOVE、ACTOIN_UP、ACTION_CANCEL等组成,其中一次事件序列中,DOWN和UP都只有最多一个,MOVE有若干个,可以为0个。
定律:某个View只有将ACTION_DOWN处理(消费)掉,才会有机会处理后面的ACTION_MOVE和ACTION_UP。 - 定律:正常情况下,一个事件序列只能被一个View 拦截且消耗。 因为一旦一个元素拦截了某事件,那么同一个事件序列内的所有事件都会直接交给它处理,因此同一个事件序列中的事件不能分别由两个View同时处理。 但是通过特殊手段可以做到,比如一个View将本该自己处理的事件通过 onTouchEvent 强行传递给其他 View 处理。
- 事件分发中只有两个主角:ViewGroup和View。
ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个有关方法,View仅包含dispatchTouchEvent、onTouchEvent两个有关方法。其中ViewGroup又继承于View。
ViewGroup 默认不拦截任何事件。Android 源 码中 ViewGroup 的 onInterceptTouchEvent 方法默认返回 false。 - 事件传递的两种方式:
隧道方式:从根元素依次往下传递直到最内层子元素;
冒泡方式:从最内层子元素依次往外传递直到根元素。
dispatchTouchEvent是隧道方式,onTouchEvent是冒泡方式(若返回true,则上层不再处理)。 - parent.requestDisallowInterceptTouchEvent(boolean)的作用:在子View中有机会告诉父View是否要拦截事件。
注意:无法通过调用该方法让父View拦截ACTION_DOWN事件。
参考:
《Android开发艺术探索》
《Android - 事件模型》https://www.cnblogs.com/bill-joy/archive/2012/03/20/2407928.html