fix(iced/feedback): 复审 r3 的 A/B/D/E/F 项 + C 项待 rebase 后改 view_at

(先落一个中间提交,rebase main 之后再按 tower 的修正把空态图标改成 32/view_at)
This commit is contained in:
AskaEth committed 2026-11-02 15:56:46 +08:00
1 parent 5d9e75efd8
commit a4cdd61fe5
12 files changed
+325 -108

No files matched your search

@@ -18,13 +18,16 @@
//! 所以 [`KeyPoint::easing`] 的语义就是段起点的缓动;最后一点之后一律**保持末值**
//! (Compose 对未覆盖的区间就是保持,这也是「段跑到头以后停在满格」的来源)。
//!
//! ## 首点必须在 `ms = 0`(复审 P1-B 的教训)
//! ## 首点的两种合法情况(复审 P1-B 的教训)
//!
//! Compose 在 keyframes **缺 0ms 关键帧**时会自己补一个 `t = 0`、值 = 动画**初值**的点
//! (`VectorizedKeyframesSpec` 构造里 `Map.containsKey(0) == false` 就 `timestamps.add(0, 0)`,
//! 且 `playTime <= 0 → startValue`)。本求值器不猜:首点不在 0 就 `debug_assert` 炸,
//! 逼调用方把那个点显式写出来(环形旋转就漏过这一点:`ROTATION` 首点是 300ms/90°,
//! 于是 `[0, 0.05)` 被恒定为 90°,周期末尾 360° → 下周期 90° 还会瞬时倒跳 270°)。
//! 且 `playTime <= 0 → startValue`)。本求值器对这种情况按「保持首值」处理,而它**只等价于**
//! Compose 的「初值」—— 所以守卫是「首点不在 0ms **且** 首值 ≠ 0」才 `debug_assert` 炸:
//!
//! - `SEG_TAIL_1/2`(首点 250/900ms、首值 **0**)与 Compose 的「初值 0」等价,**合法**;
//! - `ROTATION` 曾经首点 300ms/**0.25**:`[0, 0.05)` 被恒定成 90°、周期末尾 360° → 下周期
//! 90° 瞬时倒跳 270°。现在首点显式补成 0ms/0°。
use unlucky_design::motion::Easing;