首先来讲讲viewgroup的事件分发机制(盗来的图):
首先执行diapatchtouch,在diapatchtouch中调用onintercepttouchevent,在其中判断有没有拦截,如果拦截了就不调用子view的diapatchtouch,调用自身的touch事件,如果不拦截就调用子view 的diapatchtouch,执行view的事件分发机制。
这里也再说说view的分发机制好了:首先必定的dispatchTouch
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
}
mOnTouchListener就是我们setontouchlistner时候赋的值,这个值只要我们set了就不会空,第二个判断是是否可点击,最后一个就是我们在setontouchlistener中重写的那个touch方法,在这里如果我们的touch返回false的会就继续调用ontouchevent方法,在其中会调用onclick方法。还有一个要注意的地方,当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回true,才会触发后一个action