伪代码解释事件传递过程:
public boolean dispatchTouchEvent(MotionEvent ev) { boolean consume = false;//事件是否被消费 if (onInterceptTouchEvent(ev)){//调用onInterceptTouchEvent判断是否拦截事件 consume = onTouchEvent(ev);//如果拦截则调用自身的onTouchEvent方法 }else{ consume = child.dispatchTouchEvent(ev);//不拦截调用子View的dispatchTouchEvent方法 } return consume;//返回值表示事件是否被消费,true事件终止,false调用父View的onTouchEvent方法 }
关键方法:
dispatchTouchEvent:处理时一定会调用的方法
onInterceptTouchEvent:是否拦截;如果第一次move拦截了,那之后不会再调用该方法了,直到下一次的触摸
onTouchEvent:真正处理该view触摸事件的方法