F7.11.3Coalesce rapid motion triggers设计
连续快速操作触发的动效应合并或跳过而非排队播放
别名: 动效合并 · 动画队列 · 连点排队
概念解释
快速连点产生的八段位移如果排队逐段播放,人看到的是自己已经放弃的中间页在依次闪过。连续触发时,运动要合并到最新目标或跳过中间态,不能做先进先出的影院排片。队列把每一次历史意图都演一遍,和「当前意图进不来」不同:意图进来了,只是被排在旧动画后面。
机制
触发器每次都 play() 一条新动画,默认入队。连点 Tab、连按步进、连弹返回,队列长度等于多余的意图数。视觉上出现:已经要去第 5 项,却必须先看 2、3、4 的入场。目标在队列里移动,命中区跟着过时坐标跑,误点率上升。
合并的含义是:新触发到来时,正在播的那条以当前进度为起点,改插值到最新终点,中间那些过时终点永不绘制。跳过的含义是:直接切到最新终态。两者都丢掉历史意图的演出权。弹簧在这里特别糟,因为每条队列项还带着速度,合并会把相位叠乱——这也是为什么高频控件不该用过冲,但即使没有过冲,队列本身已经错了。
边界
- 需要保留过程记录的场景(撤销栈可视化、时间线回放)例外,那些运动就是历史本身。
- 两次触发间隔长于稳定时间,谈不上队列,按两次独立过渡处理。
- 合并到最新仍要落在合法状态,不能把两个终态的字段混成第三份数据。
怎么落地
- 对同一属性、同一对象的新触发,取消未完成的动画并改向最新终点,或直接
finish()到最新。 - 不要用全局动画队列承载导航;导航只保留当前目标路由。
- 验证:连点 8 次步进或 8 个 Tab。若屏幕依次走过中间 6 个,就是在排片;应只看到最后一次的落点。