为什么执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了?

在郭霖大神的博客:Android事件分发机制完全解析,带你从源码的角度彻底理解(上)中有这样一句话:

如果你在执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了。简单的说,就是当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回true,才会触发后一个action。

准确的描述应该是这样:

如果一个子view处理了down事件,也就是返回了true。那么单链表中,会记录这个子view,后续的move和up事件都会分发给这个子view处理。如果这个子view返回false,大概率是这个子view不可点击,那么就会由别的子view或者父类的ViewGroup消费这个事件,那么单链表里面,就没有这个子view了,那么后续的move和up也就不会再派发给这个子view。所以准确的说法应该是如果某个子view,对down事件返回false,那么move和up事件就不会再派发给这个子view,而不是说move和up事件不会再执行。

举个例子:
自定义一个MyLayout继承自LinearLayout,里面放一个ImageView。点击ImageView,down事件进入ImageView的onTouchEvent方法,ImageView不可点击,返回了false. 经过一系列回传,最终由MyLayout的onTouchEvent方法处理,后续的move,up事件都不再分发给这个ImageView,直接分发给MyLayout了。

详细解释这里面的许多细节,完整源码参考郭霖大神的这两篇文章,虽然代码对应的系统版本较低。
Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

具体过程如下:
1.ImageView的onTouchEvent返回false
2.ImageView的dispatchTouchEvent返回false
3. MyLayout的dispatchTouchEvent中,遍历所有子view的for循环中,if条件不成立,不会走return true;

                       if (child.dispatchTouchEvent(ev))  {
                           mMotionTarget = child;
                          return true;
                       }
  1. MyLayout的dispatchTouchEvent方法内部,继续执行:return super.dispatchTouchEvent(ev);,其实就是View.java类中的dispatchTouchEvent方法。
   if (target == null) {
       ev.setLocation(xf, yf);
        if ((mPrivateFlags & CANCEL_NEXT_UP_EVENT) != 0) {
            ev.setAction(MotionEvent.ACTION_CANCEL);
            mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT;
        }
        return super.dispatchTouchEvent(ev);
    }
  1. MyLayout的父类View.java中,dispatchTouchEvent方法内部,执行onTouchEvent,down事件被消费。
  2. 当move事件到来时,先进入MyLayout的dispatchTouchEvent方法中,由于target仍然为空,所以还是执行return super.dispatchTouchEvent(ev);,也就是由MyLayout直接处理move和up事件。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值