【Android开发坑系列】之事件分发机制

总结一下:html

  1. 事件序列的定义:从手触摸屏幕(含)到离开屏幕(含)期间所发生的一系列交互事件。
    主要由ACTION_DOWNACTION_MOVEACTOIN_UP、ACTION_CANCEL等组成,其中一次事件序列中,DOWN和UP都只有最多一个,MOVE有若干个,能够为0个。
    定律:某个View只有将ACTION_DOWN处理(消费)掉,才会有机会处理后面的ACTION_MOVE和ACTION_UP。

  2. 定律:正常状况下,一个事件序列只能被一个View 拦截且消耗。 由于一旦一个元素拦截了某事件,那么同一个事件序列内的全部事件都会直接交给它处理,所以同一个事件序列中的事件不能分别由两个View同时处理。 可是经过特殊手段能够作到,好比一个View将本该本身处理的事件经过 onTouchEvent 强行传递给其余 View 处理。

  3. 事件分发中只有两个主角:ViewGroup和View。
    ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个有关方法,View仅包含dispatchTouchEvent、onTouchEvent两个有关方法。其中ViewGroup又继承于View。
    ViewGroup 默认不拦截任何事件。Android 源 码中 ViewGroup 的 onInterceptTouchEvent 方法默认返回 false。

  4. 事件传递的两种方式:
    隧道方式:从根元素依次往下传递直到最内层子元素;
    冒泡方式:从最内层子元素依次往外传递直到根元素。
    dispatchTouchEvent是隧道方式,onTouchEvent是冒泡方式(若返回true,则上层再也不处理)。

  5. parent.requestDisallowInterceptTouchEvent(boolean)的做用:在子View中有机会告诉父View是否要拦截事件。
    注意:没法经过调用该方法让父View拦截ACTION_DOWN事件。

 

参考:spa

《Android开发艺术探索》
《Android - 事件模型》https://www.cnblogs.com/bill-joy/archive/2012/03/20/2407928.html htm

相关文章
相关标签/搜索