android View的点击事件分发机制的简单认知

android View的点击事件分发机制的简单认知

对MotionEvent事件的分发过程称为点击事件的分发。点击事件的分发过程由三个很重要的方法来共同完成:dispatchTouchEventonInterceptTouchEventonTouchEvent

dispatchTouchEvent

public boolean dispatchTouchEvent(MotionEvent ev)

Touch 事件发生时 ,事件最先传到当前Activity 的 dispatchTouchEvent(MotionEvent ev) 方法,由它来进行事件的分发(从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递)

onInterceptTouchEvent

public boolean onInterceptTouchEvent(MotionEvent ev)

在dispatchTouchEvent法内部调用,用来判断是否拦截某个事件,如果当前View拦截某个事件,那么同一个事件序列当中,此方法不再调用。返回结果表示是否拦截当前事件。如果不拦截,这个事件将会传递当该View的子View的dispatchTouchEvent中,继续往下传递。

onTouchEvent

public boolean onTouchEvent(MotionEvent ev)

当前View拦截某个事件即onInterceptTouchEvent方法返回true,如果该View设置了OnClickListener,则onTouch会被调用,否则onTouchEvent会被调用。也就是说onTouch优先级大于onTouchEvent,onTouchu会屏蔽掉onTouchEvent。true表示消耗此事件,false,则该事件会被传到父控件的onTouchEvent中。

引用Android开发艺术探索书中的一段伪代码,可以将上述三个方法的关系表现的完美。

public boolean dispatchTouchEvent(MotionEvent ev){
   boolean consume = false;
   if(onInterceptTouchEvent(ev)){
     consume = onTouchEvent(ev);
   } else {
     consume = childView.dispatchTouchuEvent(ev);
   }

     return consume;
}

相关资料:Android开发艺术探索书

你可能感兴趣的:(Android杂文)