多点触控下每个触点独立携带开始移动结束的完整生命周期
别名: 触点生命周期 · pointer id · 多点独立
概念解释
多点触控里,系统给每个接触分配稳定的触点标识(pointer id / touch identifier),并让它单独走完开始—移动—结束(或取消)。两根手指不是“一份触摸事件里的两个坐标”,而是两条并行的生命周期。一根手指抬起,只结束那一条;另一根可以继续移动。把所有手指当成一个集合来切换“有触摸/无触摸”,会在中途缺指时把还按着的那根一并拆掉。
机制
电容控制器按接触斑块分别跟踪。操作系统用 identifier 把后续采样绑回同一斑块,直到该斑块消失或被取消。应用层手势常常需要两根手指的相对运动,但实现上仍应先按 id 维护各自的位置历史,再在手势识别器里组合。一只手指被系统手势抢走时,通常只那一个 id 收到 cancel;另一只应保持自己的移动流。若用“当前触点数从 2 变成 1”当结束条件,捏合会在用户故意改成单指拖动时被误杀,或者反过来在一只已取消后仍用陈旧坐标算缩放中心。
怎么研究
记录每个 identifier 从出现到消失的事件序列,让被试做:两指同时按下后先抬一根;一指按住再落下第二根;两指移动时系统抢走其中一根。自变量是落指顺序、抬起顺序、以及被取消的是主指还是辅指。因变量是每个 id 是否都有成对的终止事件、手势识别器在缺指后给出的变换、以及剩余那根能否继续滚动。只看“多指手势成功率”会把生命周期错误掩盖成识别率问题。
边界
触点独立不等于手势独立。系统仍可能把整组触点判给同一个识别器,一只被取消后整组手势作废。硬件把两指合成一个斑块时,应用只会看到一个 id,生命周期再正确也变不成两指。网页里 touches 与 changedTouches 的语义不同:后者只含本帧状态变化的那些点,用错集合会把未变化的手指当成消失。超过设备上限的新指不会获得 id,谈不上独立生命周期。
怎么落地
- 用 map 以 pointer id 为键保存每根手指的起点、上次位置和速度;终止时只删除那一个键。
- 捏合、旋转在缺指后明确分支:降级为单指平移、冻结变换,或取消整段手势,不要继续用已删除 id 的坐标。
- 在真机上录两指不同时抬起、以及一指被系统手势收走的轨迹,核对日志里每条 id 都有结束或取消。