嗒啦啦使用优化-手指滑动列表后松手会误触发列表项的点击事件
05/1559 浏览开发心得
大家好,分享内容如下:
一、问题
手机真机上的可滑动列表(VirtualList / ScrollView),手指滑动列表后松手,会误触发列表项的点击事件,打开详情页。用户本意是滑动浏览,不是点击。
二、根因
引擎 UI 层的 HandlePointerUp 在判断是否触发 OnClick 时,只检查了"抬手时手指在哪个控件上"(widget == pressedWidget),完全不检查手指是否发生过滑动位移。只要按下和抬起是同一个控件,就无条件派发 OnClick。引擎的 Gesture 系统有一套正确的滑动抑制机制(OnTap 事件在滑动后会被吞掉),但页面代码用的是 onClick 而不是 onTap,所以这套保护没生效。而 urhox-libs/ 是只读引擎库,无法从源头修改 HandlePointerUp 的逻辑。
三、解决
创建了 scripts/utils/TouchGuard.lua 工具模块,在应用层独立解决:
- TouchBegin:记录每个触摸点的起始坐标
- TouchMove:计算手指位移,超过 12px 阈值时标记 touchScrolling[id] = true
- TouchEnd:清理该触摸点的记录
页面在 onClick 回调顶部调用 TouchGuard.IsScrolling(),遍历 touchScrolling 表,有任何触摸点处于滑动状态就返回 true,拦截此次点击。关键设计点:IsScrolling() 直接读取 touchScrolling 表的实时状态,而不是等 TouchEnd handler 拷贝一份再读。因为 UI 的 TouchEnd handler 订阅更早、会先执行并触发 OnClick,此时 TouchGuard 的 TouchEnd 清理逻辑还没跑,touchScrolling[id] 仍为 true,刚好能正确拦截。


