超过上限的触点通常被系统丢弃而非报错提示
别名: 触点丢弃 · 静默丢点 · overflow touch
概念解释
第 N+1 根手指落下时,多数系统不会抛异常、不会振动、也不会弹出“触点过多”。多出来的接触从输入流里消失,已有的 id 继续报点,好像那根手指从未存在。用户看见自己的手按在屏幕上,应用的事件日志是空的。这是静默丢弃,不是取消:被丢掉的接触没有生命周期,因此也没有 cancel 可以清理。
机制
槽表满了之后,控制器的策略通常是忽略新斑块,偶尔是踢掉最老或面积最小的旧斑块来给新指让位。无论哪一种,操作系统很少把“溢出”提升成应用可订阅的错误通道,因为传统 GUI 假定触点流是事实,而不是可能失败的资源分配。应用若只监听 begin/move/end,溢出表现为“少了一个 begin”。用户既得不到失败信号,也无法把被丢的那指改成点击——它不在命中测试里。更麻烦的是部分实现会在稍后旧指抬起时,把一直贴着的第 N+1 指突然收编成新 id,造成一次凭空的 begin,位置还可能跳在屏幕另一侧。
怎么研究
在已知上限的设备上让第 N 指按住,再落下第 N+1 指,对照高速摄影与事件日志。自变量是溢出策略(忽略新指 vs 驱逐旧指,若能从厂商文档或逆向观察区分)、新指落在空白还是落在按钮上、以及旧指随后抬起的顺序。因变量是是否出现 begin、是否有任何错误回调、被丢手指正下方的控件有没有响应、以及旧指抬起后是否冒出迟来的 id。把“用户报告点了没反应”和“日志里根本没有事件”配对,才能把静默丢弃从普通未命中里分出来。
边界
个别工业触摸框架会提供 onPointerRejected 一类回调,那是例外,不能当成消费电子的默认。把新指设计成“修饰键”(例如三指按下才出菜单)时,静默丢弃会让菜单概率性消失,用户以为手势没学会。游戏里用多余的拇指当射击键,溢出时键位直接蒸发。掌托被当成触点占槽,看起来像“手指被丢”,其实槽被手掌占了;要用面积和位置把这两种静默分开。
怎么落地
- 需要三指以上的操作时,在调试 HUD 里显示当前存活 id 数;一旦达到设备上限,改走可见的按钮或提示,而不是继续等那根不会到来的手指。
- 不要把“第 N+1 指落下”当成可靠的模式开关;用界面控件或两指以内的手势完成同样的事。
- 客服和日志里把“有接触无事件”标成一类独立缺陷,避免按未命中或延迟去调按钮尺寸。