
dispatchTouchEvent
只有返回super的情况下才会向下分发,分发的情况为:
Activity调用viewGroup的dispatchTouchEvent;
viewGroup 会调用自身的onInterceptTouchEvent();
然后再调用view的dispatchTouchEvent();
最后view 会调用onTouchEvent();
在这每个阶段,如果返回了true,直接消费掉,事件没有任何控件处理,认为这个事件是个费事件; 如果返回false,这个事件不再向下分发,而是调用父控件的onTouchEvent()方法,注意Acitvity会直接消费掉;
onInterceptTouchEvent
这个方法只有ViewGroup中含有,返回true拦截事件交给自身的onTouchEvent方法处理(一定要看注意第三条) 返回false和super会分发给子view的dispatchTouchEvent();
onTouchEvent();
返回super和false会调用父View的onTouchEvent方法, 返回true代表消费该事件
注意:
-
每一次touch产生的action事件,如果down事件在onTouchEvent()返回false,那么系统认为当前View不关心这一次的touch事件,此时这个action会传向父级,调用父级View的onTouchEvent。 如果这个事件没有任何控件进行处理,那么这一次的touch事件之后发出的任何action(move up),该View都不会再接受,onTouchEvent在这一次的touch产生的action事件再也不会触发;但是如果我们对acition事件在dispatchTouchEvent方法消费了,那么后续的action事件仍能继续传递。只要走了onTouchEvent()并且返回了false那么后续的事件都不会接收到。 -
如果在ViewGroup的OnTouchEvent中down事件返回true,那么后续move、up不会走onInterceptTouchEvent,而是直接交给viewGroup自身的onTouchEvent来处理。也就是说父层已经截获了这次touch事件,之后的action也不必询问onInterceptTouchEvent,因此在viewGroup的子view中不会再接收到后续的move和up事件。 -
onInterceptTouchEvent,返回true拦截事件交给自身的onTouchEvent方法处理这个表述是不完整的。我们知道如果onInterceptTouchEvent返回false,那么本次action将发送给更深层的View, 并且之后的每一次action都会询问父层的onInterceptTouchEvent需不需要截获本次touch事件。如果第一次touch产生的down事件由子view进行处理了,那么后续产生的事件(move\up)在onInterceptTouchEvent()进行了return true的拦截,此时系统认为该viewgroup对此事件不进行处理,将调用父view的onTouchEvent()方法进行处理,并不会交给自身的onTouchEvent()来处理。我们说onInterceptTouchEvent,返回true拦截事件交给自身的onTouchEvent方法处理这个表述的满足情况是,actionDown事件在onInterceptTouchEvent 进行了拦截,会交给自身的onTouch来处理。
有兴趣可以关注一下个人的公众号,一起来交流学习; 
|