「神秘按钮失踪事件」:一次 Android 事件分发机制的探秘

“咦?这个按钮怎么点不动了?”
当测试同事指着屏幕上一脸疑惑时,我知道,一个不速之客——Bug——找上门了。

这是一个Android基线项目。用户点击视频播放按钮,应该能开始播放视频,可现在,按钮就像中了石化魔法,毫无反应。

今天,我们一起解密这次“神秘按钮失踪事件”的真相。

故事要从一天的系统测试说起。

“测试反馈说,在三星设备上,点击视频播放按钮没有任何反应。”测试同事一边汇报,一边将手机递了过来。
我接过手机,点了点按钮,果然,毫无动静。视图上,按钮纹丝不动,像个冷酷的NPC。

于是,问题归我负责。主管还不忘补上一句:“明天提测前必须搞定。”
我深吸一口气,心里默念:“按钮,我一定会让你开口说话。”

初步调查

首先,我给按钮的点击事件加了日志。

然而,日志里一片死寂。这个按钮似乎完全拒绝与我交流。“连 onClick 都进不去?”我皱起眉头,意识到问题可能并不简单。说明问题不是代码逻辑本身,而是事件压根没到按钮那里。

深入分析

“emm,单击事件是什么情况会触发?”我思考片刻想到,当用户触摸屏幕时,触发ACTION_DOWN事件,如果用户在短时间内抬起手指,触发ACTION_UP事件且手指没有移动或仅移动距离小于阈值,则系统会调用单击事件的onClick。

“事件压根没到按钮那里!那就是触摸事件分发机制需要看看”。我打开 Layout Inspector,查看了按钮的层级结构:

ImageView -> RelativeLayout -> InterruptFramLayout -> CustomRecycleView -> QDragRelativeLayout

这是个复杂的布局嵌套。果然,问题多半藏在这片深不见底的布局海洋里,不过从自定义View入手便可。

找到嫌疑人

1号嫌疑人:InterruptFramLayout

继承于FrameLayout,内部增加了手势事件,在onInterceptTouchEvent()方法中是这么写的。

override fun dispatchTouchEvent(event: MotionEvent): Boolean {
   
        gestureDetector.onTouchEvent(event)
        return super.dispatchTouchEvent(event)
}

1号嫌疑人不会拦截触摸事件的传递。

2号嫌疑人:CustomRecycleView

在onInterceptTouchEvent()方法中,有这么一段代码:

override fun onInterceptTouchEvent(ev: MotionEvent)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤奋的oyoung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值