播放控制
拿到 AnimationControls 之后,就可以对已注册的 timeline 发命令:播、停、seek、反向或取消。语义和底层用采样还是原生 lowering 无关。
控制命令
| 操作 | 语义 |
|---|---|
play / pause / resume | 播放、暂停、从当前位置恢复 |
restart | reset 后开始新生命周期 |
reverse | 反转方向,不隐式开始或恢复 |
seek | 立即采样,不触发 crossing event |
seek_with_events | 采样并处理 call/loop/terminal crossing |
complete | finite timeline 到 terminal |
cancel | 停止并保留最后提交视觉值 |
reset | 回到计划逻辑起点 |
revert | 恢复首次播放前捕获的 baseline |
stretch | 保持 normalized progress 重映射 duration |
refresh | 重做 target/unit/layout/baseline resolve |
set_timeline | 运行时替换计划 |
cancel、reset 和 revert 不是同义词。关闭临时交互通常 cancel;需要回到设计态用 revert;要重新从计划起点播放用 restart。
读取状态
snapshot 返回播放状态、时间、进度和 outcome;direction 返回当前方向;lowering_report 说明 backend 选择。
let snapshot = controls.snapshot();
if snapshot.state == PlaybackState::Paused {
controls.resume();
}
普通帧不会触发 Dioxus 重渲染。只有调用 use_animation_snapshot 或 subscribe 的 scope 才接收响应式进度,避免 60fps 全树 render。
等待结束
let outcome = controls.finished().await;
match outcome {
AnimationOutcome::Completed => {}
AnimationOutcome::Cancelled => {}
_ => {}
}
finished() 等待真实 terminal outcome。Presence 和业务流程应依赖它,不用 sleep(duration) 猜结束时间。
回调顺序
begin → before_update → sample/compose → update → adapter commit → render → loop → complete/cancel → settle。
callback 只做轻量状态派发;重 I/O 放到异步任务。频繁读取 snapshot 做日志也会影响帧时间,应在开发诊断后关闭。