三者关系的伪代码:
public boolean dispatchTouchEvent(MotionEvent ev){ boolean consume = false; if(onInterceptTouchEvent(ev)){ consume = onTouchEvent(ev); }else{ consume = child.dispatchTouchEvent(ev); } return consume; }
dispatchTouchEvent():用来分发事件。
Android中所有的事件都必须经过这个方法的分发,然后决定是自身消费当前事件还是继续往下分发给子控件处理。
返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法影响,表示是否消耗该事件。
返回true表示不继续分发,事件被消费(事件会传递给当前控件的onTouchEvent(),这就是所谓的Intercept(拦截))。
返回false则继续往下分发,如果是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截该事件。
dispatchTouchEvent()方法里面调用了onInterceptTouchEvent()和onTouchEvent()。一般不重写该方法。
onInterceptTouchEvent():用来拦截事件。
如果当前View拦截了某个事件,那在同一个事件序列中,此方法不会再次调用,返回结果表示是否拦截当前事件
若返回值为True,表示拦截了事件, 则事件将终止向下(子View)传递,事件会传递到自己的onTouchEvent()。,事件由当前ViewGroup类的onTouchEvent来处理
若返回值为False传递到事件将向下传递,传递给其子View的dispatchTouchEvent();
ViewGroup类中的源码实现就是{return false;}表示不拦截该事件,;
正确的使用方法是,在此方法内仅判断事件是否需要拦截,然后返回。即便需要拦截也应该直接返回true,然后由onTouchEvent方法进行处理。
onTouchEvent():用来处理事件,消费事件。
返回值决定当前控件是否消费(consume)了这个事件。尤其对于ACTION_DOWN事件,
返回true,事件由自己处理消耗,后续动作序列让其处理;表示我想要处理后续事件;
返回false,自己不消耗事件了,向上返回让其他的父view的onTouchEvent接受处理;