fix(motion): M305 r1 —— P1 空轨道重复脉冲 + 三条 P2(进场被删跳零 / 纯重排不落终态 / 遮罩取色与口径)
- P1-1:observe_progress 在「没有轨道且目标没变」时直接 return false。少了这一条, ratio 恒为 1.0 之后每条 stage 事件都会插一条 from==to 的空轨道 ⇒ 200ms 后再闪一次 150ms 脉冲(违反「一次收束不循环」+ 空烧帧)。用例 a_repeated_reading_after_the_pulse… - P2-1:visibility_of 改成按**当前采样**取(原来取 track.from ⇒ 进场途中被删的行 0→0, 高度当拍归零、下面整列上跳)。用例 deleting_a_row_mid_enter_does_not_jump_to_zero - P2-2:遮罩底色 Card → Canvas(版本行脚下就是画布;深色档会露出亮一档) - P2-3:纯重排(同 id 换序)当场把 order 对齐 current。没有轨道 ⇒ advance 早退 ⇒ expire 不跑 ⇒ order 会永远停在旧序。用例 a_pure_reorder_lands_on_the_new_order_at_once - P2-4:fade.rs 收成唯一口径(预合成 = 恒不透明;子树淡出是唯一例外,且必须自成一层), reveal.rs 指向它并登记 interaction α 守卫扫不到这一处的盲区 - 出图补深色档 list-exit-dark.png,probe 复跑 PASS(墨色 110→148 / 105→154)
This commit is contained in:
1 parent
ae33674293
commit
d24ef21bee
8 files changed
+179
-18
No files matched your search
@@ -2,23 +2,35 @@
|
||||
//!
|
||||
//! ## 这条纪律是什么(D27)
|
||||
//!
|
||||
//! 「CPU 档零半透明」:整窗重绘里每多一层半透明,软件渲染就多一遍混合。仓内唯一的 α 出口是
|
||||
//! 「CPU 档零半透明」:整窗重绘里每多一层半透明,软件渲染就多一遍混合。仓内 α 的正统出口是
|
||||
//! **令牌层预合成**(`c.with_alpha(α).over(底)`,见 `interaction::disabled` 与
|
||||
//! `dialog/view.rs::backdrop_color_at`):产物**恒不透明**。
|
||||
//! `interaction/mod.rs` 的用例把这条钉成硬线(「为了淡出改用 `Color { a: 0.5 }`」直接红)。
|
||||
//!
|
||||
//! 本模块只剩一件工具:[`mix`]——两个**不透明**色之间按进度插值,用于「进度条到达 100% 时那一下
|
||||
//! 本模块的工具是 [`mix`]——两个**不透明**色之间按进度插值,用于「进度条到达 100% 时那一下
|
||||
//! 强调收束」(`feedback/progress.rs::linear_with`)。它不改几何、不改厚度,所以**不引起重排**。
|
||||
//!
|
||||
//! ## 为什么这里没有「整行淡出」
|
||||
//! ## 唯一的例外:子树淡出(口径写在这里,别处不许再有第二种说法)
|
||||
//!
|
||||
//! 列表行的淡出走的是 `motion/reveal.rs` 的收尾遮罩(原因写在那里:`Element<'a>` 借 `&'a Ui`,
|
||||
//! 视图函数里现造的「淡化版 Ui」撑不到返回;把它泄漏成 `'static` 会让每帧每行泄漏一份 49 色方案)。
|
||||
//! 行内容因此**永远逐像素实色绘制**,只有裁切框与那一层遮罩在变。
|
||||
//! | 场景 | 做法 | 产物透明度 |
|
||||
//! |---|---|---|
|
||||
//! | 颜色插值(进度条收束、遮罩浓度、禁用层) | [`mix`] / `with_alpha(α).over(底)` | **恒 1.0** |
|
||||
//! | **一整棵子树淡出**(列表行) | `motion/reveal.rs` 的收尾遮罩:与**画布同色**的 quad,α = 1 − 可见度,且**必须自成一层** | 动画期间 < 1,**静息帧严格不画** |
|
||||
//!
|
||||
//! 为什么子树淡出做不到「预合成」:预合成要求先知道被盖住的像素(`content.with_alpha(α).over(底)`),
|
||||
//! 而「一行的内容」在 `Element` 里是黑盒;唯一可行的替代是把整份 `Scheme` 预合成后换一个 `Ui`
|
||||
//! 传下去,但那要求淡化的 `Ui` 活得比 `Element<'a>` 久——视图函数里现造的 `Ui` 撑不到返回,
|
||||
//! 泄漏成 `'static` 则是每帧每行泄漏一份 49 色方案(长会话无界增长)。
|
||||
//!
|
||||
//! ⚠️ **守卫盲区(r1 复审 P2-4 要求写清)**:`interaction/mod.rs` 那条「中间帧也必须不透明」的
|
||||
//! 用例只扫**状态层取色**,**扫不到** `motion/reveal.rs::draw` 递出去的遮罩(那一处是渲染器的
|
||||
//! `fill_quad`,不经过任何 `Style`)。所以「遮罩的 α 只在动画期间出现、静息帧一个 quad 都不画」
|
||||
//! 这条口径改由 `pages/download/rows/motion_tests.rs` 的结构断言 + 出图基线盯着
|
||||
//! (静息帧与改造前逐像素相同,见 `DevDocs/artifacts/m305/`)。
|
||||
|
||||
use unlucky_design::color::Color;
|
||||
|
||||
/// 两个**不透明**颜色之间按 `t` 的插值(预合成口径,同 [`faded`] 的纪律)。
|
||||
/// 两个**不透明**颜色之间按 `t` 的插值。
|
||||
///
|
||||
/// 用在「进度条收束」这类没有背景色可叠的地方:`to.with_alpha(t).over(from)` 得到的是
|
||||
/// 「把 `to` 按 t 盖在 `from` 上」的**实色**,产物恒不透明(D27);端点 `t = 0` / `1`
|
||||
|
||||
Reference in new issue
Block a user