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

总结一下:

  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事件。

 

参考:

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

 

posted @ 2015-09-07 13:42  Kai.Ma  阅读(425)  评论(0编辑  收藏  举报