dispatchTouchEvent,onTouchEvent,onInterceptTouchEvent 解析

 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()处理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值