View 没有onInterceptTouchEvent事件, onTouchEvent 事件被dispatchTouchEvent调用
伪代码
public boolean dispatchTouchEvent(MotionEvent event) {
if(mOnTouchListener != null&&mOnTouchListener.onTouch(this, event)){
return true;
}
if(onTouchEvent(event)){
return true;
}
}
针对一个View来讲,事件是先走该View的dispatchTouchEvent,然后再走onTouchEvent(也有可能不走)。在事件到达view的时候,先走dispatchTouchEvent,在系统的dispatchTouchEvent中它会先判断是否设置了OnTouchListener监听,若设置监听调用该监听的OnTouch方法,如果OnTouch方法返回true,则dispatchTouchEvent直接返回true,则不会调用OnTouchEvent方法。
或者我们重写dispatchTouchEvent,不走super.dispatchTouchEvent直接返回false,它就不会走onTouchEvent。当然这样做是违反android架构常理的,一般的dispatchTouchEvent是不建议重写的。
ViewGroup继承View之后才加了一个方法叫onIntercepTouchEvent。从字面意思可以看出,onInterceptTouchEvent是拦截器,用来拦截事件用的,dispatchTouchEvent是用来分发事件的,onTouchEvent是用来处理事件的。如果在ViewGroup里覆写了onInterceptTouchEvent()方法,那么就可以对各种touch事件加以拦截。但是如何拦截 是比较复杂的,touch事件在onInterceptTouchEvent()和onTouchEvent以及各个childView间的传递机制完全 取决于onInterceptTouchEvent()和onTouchEvent()的返回值。并且,针对down事件处理的返回值直接影响到后续 move和up事件的接收和传递。
关于返回值的问题,return true和return false,代表的是是否消费完该事件,也就是该事件是否会继续传递给下层或者上层组件继续处理。return true代表消费完不会继续传递,return false代表没有消费完将会继续传递。
基本的规则是:
1. down事件首先会传递到onInterceptTouchEvent()方法
2. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。
3. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的 onTouchEvent()处理,注意,目标view将接收不到任何事件。
4. 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。
5. 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。