干货总结!从源码分析点击事件、触摸事件、enabled、clickable的关系

本文详细分析了Android中点击事件和触摸事件的关系,包括onTouchListener与onTouchEvent如何受enabled属性影响,以及onTouchEvent与onClickLisener与clickable状态的交互。总结了在不同条件下的事件分发行为,并通过代码验证了这些结论。
摘要由CSDN通过智能技术生成

直接来总结

附上本人总结的表格(已用代码验证)

enabled clickable onTouchListener是否会被调用 onTouchListener#onTouch返回值 onClickListener是否会被调用 onTouchEvent返回值 dispatchTouchEvent返回值
true true true true true
true true false true true
true false true true true
true false false false false
false true - true true
false false - false false
  • 只要viewenabledonTouchListener就会被调用
  • 只有viewenabled且可点击(clickablelongClickablecontextClickable任意一种),且onTouchListener返回falseonClickListener才会被调用
  • 如果onTouchListener没有消耗事件,且是可点击的(三种情况),那么无论设不设置onClickListener也无论其返回值是什么,此事件都会被消耗,因为ViewonTouchEvent对事件进行了默认处理

不设置onTouchListeneronClickListener相当于返回false
dispatchTouchEvent返回值是为了分析父子View事件分发,表示触摸事件是否被消费

分析

触摸事件(TouchEvent)分发的起始点为Activity#dispatchTouchEvent(MotionEvent event),上一层就是Native层了

public boolean dispatchTouchEvent(MotionEvent ev) {
   
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
   
        onUserInteraction();
    }
    //先给Window处理,里面再给DecorView处理,再是ViewGroup,然后分发给各个View或ViewGroup
    if (getWindow().superDispatchTouchEvent(ev)) {
   
        return true;
    }
    //如果没有人处理,最后自身的onTouchEvent作为兜底事件
    return onTouchEvent(ev);
}

onTouchListener与onTouchEvent以及enable的影响

View#dispatchTouchEvent(MotionEvent event)中有如下代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值