用途
Makepad 2.0 Animation Skill 是关于 Makepad 2.0 动画系统(Animator)的技能文档。Animator 系统随时间驱动 instance() 着色器变量,用于实现悬停效果(hover effect)、过渡(transition)和循环动画。它使用相互独立、同时运行的动画轨道,称为 group。
版本标注为 makepad-widgets(dev branch),最后更新日期 2026-03-03。
主要能力
控件支持范围:并非所有控件都支持 animator。给不支持的控件添加 animator 会被静默忽略,没有报错、没有动画、也不会有任何变化。
支持 Animator 的控件:View、SolidView、RoundedView、ScrollXView、ScrollYView、ScrollXYView、Button、ButtonFlat、ButtonFlatter、CheckBox、Toggle、RadioButton、LinkLabel、TextInput。
不支持 Animator 的控件:Label、H1-H4、P、TextBox、Image、Icon、Markdown、Html、Slider、DropDown、Splitter、Hr、Filler。若要让 Label 有动画,需要将其包裹在带 animator 的 View 中。
Animator 结构:由 group 组成,每个 group 包含 default 指向的状态名,以及若干 AnimatorState。每个 AnimatorState 可包含 from、ease、redraw、apply。
Groups(分组):每个 group 是一条独立动画轨道,多个 group 可同时动画且互不干扰。常见 group 包括 hover(鼠标悬停进出)、focus(键盘焦点)、active(切换/选中状态)、disabled(禁用状态)、time(持续循环)。每个 group 通常有 off、on 状态。
from 块:控制过渡时序。键为被过渡来源的状态,all 为兜底。可写 from: {all: Forward {duration: 0.2}}(任意状态出发,0.2 秒过渡)、from: {all: Snap}(瞬时)、或按来源状态分别指定不同时长。
播放类型(Play Types):Forward {duration} 一次性向前播放,用于悬停过渡;Snap 瞬时跳转,用于默认状态初始化;Loop {duration} 循环动画,用于加载旋转器;ReverseLoop {duration} 往返循环(ping-pong),用于脉冲效果;BounceLoop {duration} 回弹往返,用于弹跳动画。
缓动函数(Ease Functions):Linear(匀速),以及 InQuad/OutQuad/InOutQuad、InCubic/OutCubic/InOutCubic、InQuart/OutQuart/InOutQuart、InQuint/OutQuint/InOutQuint、InSine/OutSine/InOutSine、InExp/OutExp/InOutExp、InCirc/OutCirc/InOutCirc、InElastic/OutElastic/InOutElastic、InBack/OutBack/InOutBack、InBounce/OutBounce/InOutBounce。用法为在 AnimatorState 中写 ease: OutCubic,可选,默认 Linear。
apply 块:设置要动画到的目标值,结构对应控件的着色器属性。可动画单个或多个属性。关键限制:只有 instance() 着色器变量可以动画,uniform() 变量不可。
使用方式
文档给出完整的悬停按钮示例(HoverCard),要点包括:new_batch: true 对带背景的可悬停项是必需的;cursor: Hand 在悬停时显示手型指针;instance hover: 0.0 声明可动画变量;mix(color1, color2, self.hover) 在颜色之间插值。
时间轴动画(关键帧):多步动画使用 timeline(),示例如下:
animator: Animator{
time: {
default: @off
on: AnimatorState{
from: {all: Loop {duration: 2.0}}
apply: {
draw_bg: {
rotation: timeline(){
snap(0.0)
snap(6.28)
}
}
}
}
}
}
加载旋转器模式:使用 View 加自定义像素着色器,通过 sdf.arc 绘制圆弧,配合 from: {all: Loop {duration: 1.0}} 与 timeline 中的 snap(0.0) 到 snap(6.28318) 实现旋转。
适用场景
Animator 用于控件着色器实例变量,通过状态转换(hover、focus)触发,循环使用 from 中的 Loop {duration: 1.0},适合 UI 交互(悬停、点击)、切换状态、基于着色器的加载旋转器。
与之相对的是 Vector Tween(见 makepad-2.0-vector 技能):其目标是 SVG 形状属性(fill、cx、opacity 等),语法为属性值 opacity:Tween{...},在渲染时自动触发,循环使用 loop_:true(布尔值,不是字符串),适合 SVG 路径动画、脉冲指示器、移动圆点、颜色过渡。
限制
- 只有 instance() 着色器变量可动画,uniform() 不可。
- 不受支持的控件添加 animator 会被静默忽略。
- Label、Image、Slider 等控件本身不支持,需包裹在 View 中。
最佳实践
- 为带背景且有悬停动画的 View 始终添加 new_batch: true。
- 任何想动画的内容使用 instance 变量。
- group 命名与语义用途匹配(hover、focus、active)。
- 过渡用 Forward,瞬时状态变化用 Snap。
- 初始非激活状态设置 default: @off。
- Label 无法动画,如需动画请包裹在 View 中。
- 悬停动画时长保持较短(0.1-0.3s),基于时间的动画可更长(0.5-2.0s)。
文档说明
详细文档参考本地文件:./references/animator-reference.md(完整 Animator API、播放类型、缓动函数、示例)。回答前必须先阅读相关参考文件;若读取失败或文件为空,需告知用户“Reference docs incomplete. Still answering based on SKILL.md patterns.”并仍基于 SKILL.md 模式与内置知识作答;若参考文件存在,需将其内容纳入回答。