滚动或拖动手势途中经过的按钮不应被误判为点击
别名: 滑过误点 · 滚动穿过 · touch slop
概念解释
手指或指针在空白处按下,滑过一排按钮再抬起,这是滚动或拖动,途经的按钮没有被点击。若 down 落在按钮上、随后移动超过点击容差,也应升级为滚动/拖动,而不是松手时还给一次 click。把「穿过」当成「点中」,会把浏览变成乱点。
机制
点击的意图是几乎不移动的 down-up;平移的意图是明显位移。系统用一段触控容差(touch slop)区分:位移超过阈值,手势归属滚动或拖动,沿途控件不该再收 click。运动控制受限时,一次本想点的接触也常带位移,容差要允许小抖动;但一旦位移已经明显是在扫列表,沿途的「购买」「删除」更不该被点亮。
这条和「在目标上按下再滑出去取消」不是同一段故事。取消针对的是已经对准目标的那一次按下;穿过针对的是手势一开始就不是点击。把途经节点在 pointerenter 或 touchmove 上直接触发,等于用命中测试代替手势分类。
怎么研究
在密按钮列表上做明确的滚动和拖动:从非按钮处开始滑、从按钮处开始滑过阈值、中途穿过破坏性按钮。记录是否产生 click、change、提交。
自变量:touch slop、是否在 move 上触发、列表是否用原生滚动。 因变量:平移途中的误激活次数、本意点击但因小抖动被当成滚动的次数。
自定义滚动容器常自己合成 click,要在真机手指上测,鼠标拖选文本的行为不能代替。
边界
绘画、滑块、拖排序在 move 上本来就要持续响应,那是拖的主体,不是「途经的别人的按钮」。游戏准星在按下期间经过敌人可以算命中,那是设计选择,不要用列表按钮的规则去套。容差过大,真点击会被吞成滚动;过小,滚动会误点。两条失败都要记,不能只防一种。
怎么落地
- 用平台默认的 click 合成,不要在
touchmove/pointerenter上执行购买、删除、播放。 - 位移超过点击容差后,抬起不再向沿途控件发 click;按下态随手势改为滚动态。
- 验证:从列表空白处滑过一排动作按钮。任何按钮被激活,穿过被当成了点击。再另做一次「按下按钮、几乎不移动、抬起」,确认真点击仍在。