C4.18.3Dual-hand state machines设计研究

双手独立操作时需要分别维护两套起止状态与参与状态

别名: 双手状态机 · 独立起止 · 双手参与态

概念解释

双手要真正独立操作,就不能共用一套「手势已开始 / 已结束」和「是否处于参与态」的开关。左手捏住对象不放的同时,右手应该仍能打开菜单或确认,而不把左手的维持状态清掉。这要求每只手各有一条起止状态机和参与状态,而不是在「当前有一只手在忙」的全局锁上排队。这里讨论的是状态隔离,不是把功能永久绑到某一侧——即使两只手角色相同,同时工作也需要两套状态。

机制

空中手势没有触摸抬起那样的硬件中断,起止靠识别器对每条轨迹做分段。若实现上只有一个 isPinching、一个 engaged,第二只手的松开会被写成「捏合结束」,正在进行的拖动就会提交或取消。参与态若也是全局的,一只手垂下会被当成整个人退出,另一只手的连续调节被掐断。正确的模型是:每只被追踪的手持有自己的 onset、hold、offset 和 engagement;全局层只处理两人之间的仲裁或应用级事务,不合并两只手的瞬时状态。两套状态还意味着两套超时与两套撤销粒度:松开左手应只结束左手那一笔。

怎么研究

任务设计成双手时间重叠:左手按住一个滑块,右手在按住期间触发离散命令。比较「全局单状态」与「每手一状态」两种实现。因变量包括左手调节是否被右手打断、错误提交次数、以及用户是否报告「我还捏着怎么跳了」。再加入一只手短暂丢失追踪的条件,看另一只手的状态是否被连带复位。不要只用交替使用双手的任务,那种任务测不出隔离是否存在。

边界

双手始终做同一件对称的事(一起放大、一起捧住一个物体)时,需要的是耦合而不是隔离,强行两套独立状态会把一个对象拆成两个。一只手仅作稳定身体的支架、并不输入时,不必为它分配参与态。头显里第三只「手」(控制器加上空手追踪)会变成三条状态机,未声明的第三条流是常见的漏网实现。触摸屏上的多点触控已经按触点 ID 隔离,把那套假设搬到空中时,缺少触点抬起事件,隔离必须自己做。

怎么落地

  • 按手的追踪 ID 各维护 onset/offset 与参与标志;禁止用单一布尔值表示「用户正在做手势」。
  • 规定一只手丢失或松开时,另一只手的进行中操作是继续、冻结还是提交,写成显式策略并在界面上可观察。
  • 用「左手不放、右手点三次」的脚本做回归:左手值不准跳、不准被提交;右手三次要记成三次而不是一次。

延伸

  • 同组C4.18.1 部分系统把特定功能绑定到左手或右手,另一手承担不同角色 · C4.18.2 手别绑定要求持续正确识别左右手,识别错误会导致功能错位 · C4.18.4 惯用手差异意味着默认的手别绑定可能不适配左利手用户
  • 相邻C4.03 手势的起止判定 · C4.15 参与状态的进入条件
  • 站内检索bimanual state · per-hand engagement · gesture onset offset

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/C4.18.3