Using Animations / 使用动画

PixelUI 的常用动画就是“在一段时间内把 int32_t 从 A 改到 B”。底层用定点数计算 easing,动画对象直接存在固定容量的 AnimationManager 里。

Animation demo

实际动画效果:运动参数只是 App 中的 int32_t,每一帧绘制时读取它的当前值。

早期的 AnimationManager 说明图。思路仍然一致:animate() 创建受 manager 统一更新的动画项;当前实现已改为固定容量内联 CallbackAnimation,不要把图中的长形槽位理解成堆分配指针容器。

单个值

1
2
3
4
5
6
int32_t panelX = -64;

if (!ui.animate(panelX, 0, 400, EasingType::EASE_OUT_CUBIC)) {
// 动画容器已满,可以直接设置终值或记录错误。
panelX = 0;
}

animate() 返回 bool。当 PIXELUI_MAX_ANIMATION_COUNT 个位置已经用完时,它返回 false,原变量不会自动到达终值。

两个值

1
2
3
4
if (!ui.animate(x, y, 32, 20, 500, EasingType::EASE_IN_OUT_QUAD)) {
x = 32;
y = 20;
}

这个重载需要同时有两个空动画位,否则直接失败,不会只启动 X 或 Y 其中一个。

自定义回调

1
2
3
4
5
6
7
8
ui.animateCallback(
0,
100,
600,
EasingType::EASE_OUT_CUBIC,
[this](int32_t value) {
brightness_ = value;
});

回调存在 etl::inplace_function<..., CALLBACK_STORAGE_SIZE> 里。捕获太大会编译失败;捕获 this 或引用时,目标必须活到动画结束或被清理。容量配置见资源上限

Easing

LINEAREASE_IN_QUADEASE_OUT_QUADEASE_IN_OUT_QUADEASE_IN_CUBICEASE_OUT_CUBICEASE_IN_OUT_CUBICEASE_OUT_BOUNCE 都可以直接传给 animate()

刷新和 markDirty()

AnimationManager 在 deadline 到达时更新值并标记 dirty,不需要开启 continuous draw。普通业务状态改变后仍要调用 ui.markDirty();调度规则见事件驱动渲染

保护和清理

  • PROTECTION::PROTECTED 只阻止 clearUnprotectedAnimations() 清理它。
  • clearAllAnimations() 会清理全部动画,包括 protected 动画。
  • ViewManager 在 App 切换/退出时会清理动画,保护标志不会让动画跨过已被销毁的 App。
  • clearAnimationProtection() 只取消保护标记,不会立即删除动画。

动画持有变量引用。如果目标不是 App 成员,要格外确认它的寿命。

最新文章
网站信息
文章数目 :
1
本站访客数 :
本站总浏览量 :
最后更新时间 :