所谓点击事件的事件分发,其实就是对MotionEvent事件的分发过程。,即当MotionEvent事件发生时,将该事件传递给一个具体的View。
而这个传递的过程就是分发过程。主要由三个方法来共同完成。
dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
dispatchTouchEvent
用来进行事件的分发,如果事件能够传递到当前的View,则一定会回调该方法,返回的结果受当前View的OnTouchEvent和下级View的dispatchTouchEvent方法的影响,表示十分消耗当前的事件。
onInterceptTouchEvent
在上述方法内部使用,表示是否拦截事件,如果当前View拦截了事件,则同一事件序列当中,此方法不会被再次调用。
onTouchEvent
在ondispatchEvent事件中调用,表示对事件的处理,返回结果表示是否消耗当前事件,
如果不消耗,则在同一事件序列中,当前View无法接收到当前事件
上面三个方法之间的关系可以用下面的代码来表示
public boolean dispatchTouchEvent(MotionEvent event) {
boolean consume = false;
if(onInterceptTouchEvent(event)) {
consume = onTouchEvent(event)
} else {
consume = child.dispatchTouchEvent(event);
}
return consume;
}
由代码可知,三者之间的关系:
当当前ViewGroup拦截了事件,则由当前的onTouchEvent处理,
如果当前ViewGroup没有拦截,则调用子View的dispatchTouchEvent,如此反复直到事件被处理。
网友评论