Using Animations / 使用动画
PixelUI 的常用动画就是“在一段时间内把 int32_t 从 A 改到 B”。底层用定点数计算 easing,动画对象直接存在固定容量的 AnimationManager 里。
![]()
实际动画效果:运动参数只是 App 中的 int32_t,每一帧绘制时读取它的当前值。
早期的 AnimationManager 说明图。思路仍然一致:animate() 创建受 manager 统一更新的动画项;当前实现已改为固定容量内联 CallbackAnimation,不要把图中的长形槽位理解成堆分配指针容器。
单个值
1 | int32_t panelX = -64; |
animate() 返回 bool。当 PIXELUI_MAX_ANIMATION_COUNT 个位置已经用完时,它返回 false,原变量不会自动到达终值。
两个值
1 | if (!ui.animate(x, y, 32, 20, 500, EasingType::EASE_IN_OUT_QUAD)) { |
这个重载需要同时有两个空动画位,否则直接失败,不会只启动 X 或 Y 其中一个。
自定义回调
1 | ui.animateCallback( |
回调存在 etl::inplace_function<..., CALLBACK_STORAGE_SIZE> 里。捕获太大会编译失败;捕获 this 或引用时,目标必须活到动画结束或被清理。容量配置见资源上限。
Easing
LINEAR、EASE_IN_QUAD、EASE_OUT_QUAD、EASE_IN_OUT_QUAD、EASE_IN_CUBIC、EASE_OUT_CUBIC、EASE_IN_OUT_CUBIC 和 EASE_OUT_BOUNCE 都可以直接传给 animate()。
刷新和 markDirty()
AnimationManager 在 deadline 到达时更新值并标记 dirty,不需要开启 continuous draw。普通业务状态改变后仍要调用 ui.markDirty();调度规则见事件驱动渲染。
保护和清理
PROTECTION::PROTECTED只阻止clearUnprotectedAnimations()清理它。clearAllAnimations()会清理全部动画,包括 protected 动画。- ViewManager 在 App 切换/退出时会清理动画,保护标志不会让动画跨过已被销毁的 App。
clearAnimationProtection()只取消保护标记,不会立即删除动画。
动画持有变量引用。如果目标不是 App 成员,要格外确认它的寿命。
