View的事件分发机制
1.view的点击事件原理
View的点击事件的分发,即对MotionEvent事件的分发,当一个MotionEvent产生后,系统需要把该事件传递到一个具体的View进行处理,该过程即为View事件的分发,在MotionEvent的传递过程中,需要经历三个重要的方法:dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent。
dispatchTouchEvent
该方法主要对事件进行分发,当时间传递到当前view时,该方法会被调用。
onInterceptTouchEvent
该方法用来判断是否拦截某个事件,如果当前view拦截了某个事件,那么在同一事件序列中,该方法不会再次被调用。
onTouchEvent
该方法用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则无法再接收后续的事件。
其中三者之间的关系如下所示:
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean consume = false;
if(onInterceptTouchEvent(ev)){
consume = onTouchEvent(ev);
}else{
consume = child.dispatchTouchEvent(ev);
}
}
即在一次事件分发的过程中,判断当前view(viewGroup)是否拦截,如果拦截,则交给onTouchEvent进行处理,如果不拦截,则交给子view的dispatchTouchEvent处理,至此完成一轮事件的分发。
注:同一事件序列事件是指从MotionEvent.ACTION_DOWN开始+中间经历的ACTION_MOVE到最后ACTION_UP的过程中的所有事件。
原文链接: link.