9 种插值器详解¶
概述¶
插值器(Interpolator)控制动画的速度曲线。它将线性的时间进度(0.0~1.0)映射为非线性的动画进度,从而实现加速、减速、弹跳等效果。
所有插值器继承自 egui_interpolator_t 基类,通过虚函数 get_interpolation() 实现映射:
struct egui_interpolator_api
{
egui_float_t (*get_interpolation)(egui_interpolator_t *self, egui_float_t input);
};
输入值 input 范围为 [0.0, 1.0],输出值可以超出此范围(如 overshoot 和 anticipate 类型)。
所有数值运算使用定点数(egui_float_t),无需浮点运算单元。
Linear – 匀速运动¶
输出 = 输入,动画匀速进行,无加减速。
适用场景:进度条填充、匀速滚动、透明度线性渐变。
static egui_interpolator_linear_t interp;
egui_interpolator_linear_init((egui_interpolator_t *)&interp);
egui_animation_interpolator_set(EGUI_ANIM_OF(&anim), (egui_interpolator_t *)&interp);
Accelerate – 加速运动¶
动画从慢到快,开始时缓慢,结束时速度最大。可通过 factor 参数调节加速程度,默认 factor=1.0 时为二次曲线。
适用场景:物体自由落体、页面快速退出。
static egui_interpolator_accelerate_t interp;
egui_interpolator_accelerate_init((egui_interpolator_t *)&interp);
// 可选:调节加速因子(默认 1.0)
egui_interpolator_accelerate_factor_set((egui_interpolator_t *)&interp, EGUI_FLOAT_VALUE(2.0f));
egui_animation_interpolator_set(EGUI_ANIM_OF(&anim), (egui_interpolator_t *)&interp);
Decelerate – 减速运动¶
动画从快到慢,开始时速度最大,结束时缓慢停止。factor 参数控制减速程度,factor=1.0 时为抛物线曲线。
适用场景:页面滑入、元素入场、列表滚动惯性。
static egui_interpolator_decelerate_t interp;
egui_interpolator_decelerate_init((egui_interpolator_t *)&interp);
egui_animation_interpolator_set(EGUI_ANIM_OF(&anim), (egui_interpolator_t *)&interp);
AccelerateDecelerate – 先加速后减速¶
动画前半段加速,后半段减速,中间速度最快。基于余弦曲线实现,产生自然的运动感。
适用场景:通用的 UI 过渡动画、元素位移、大多数默认动画场景。
static egui_interpolator_accelerate_decelerate_t interp;
egui_interpolator_accelerate_decelerate_init((egui_interpolator_t *)&interp);
egui_animation_interpolator_set(EGUI_ANIM_OF(&anim), (egui_interpolator_t *)&interp);
Anticipate – 回拉后前进¶
动画先向反方向运动一小段(蓄力),然后加速冲向目标。tension 参数控制回拉幅度,tension=0 时退化为普通加速插值器。
适用场景:按钮按下反馈、弹弓效果、需要”蓄力感”的动画。
static egui_interpolator_anticipate_t interp;
egui_interpolator_anticipate_init((egui_interpolator_t *)&interp);
// 可选:调节回拉张力(默认 2.0)
egui_interpolator_anticipate_tension_set((egui_interpolator_t *)&interp, EGUI_FLOAT_VALUE(3.0f));
egui_animation_interpolator_set(EGUI_ANIM_OF(&anim), (egui_interpolator_t *)&interp);
Overshoot – 越过后回弹¶
动画冲过目标值后回弹到终点。tension 参数控制越过幅度,tension=0 时退化为普通减速插值器。
适用场景:弹性入场、开关切换、元素弹入。
static egui_interpolator_overshoot_t interp;
egui_interpolator_overshoot_init((egui_interpolator_t *)&interp);
// 可选:调节越过张力(默认 2.0)
egui_interpolator_overshoot_tension_set((egui_interpolator_t *)&interp, EGUI_FLOAT_VALUE(1.5f));
egui_animation_interpolator_set(EGUI_ANIM_OF(&anim), (egui_interpolator_t *)&interp);
AnticipateOvershoot – 回拉 + 回弹¶
结合 Anticipate 和 Overshoot 的效果:先向反方向回拉,然后冲过目标,最后回弹到终点。tension 参数同时控制回拉和越过的幅度。
适用场景:强调性入场动画、需要”弹性”质感的交互。
static egui_interpolator_anticipate_overshoot_t interp;
egui_interpolator_anticipate_overshoot_init((egui_interpolator_t *)&interp);
// 可选:调节张力
egui_interpolator_anticipate_overshoot_tension_set(
(egui_interpolator_t *)&interp, EGUI_FLOAT_VALUE(2.0f));
egui_animation_interpolator_set(EGUI_ANIM_OF(&anim), (egui_interpolator_t *)&interp);
Bounce – 弹跳效果¶
动画到达终点后像球落地一样弹跳数次,最终停在终点。无可调参数。
适用场景:物体落地、通知弹出、数值到达目标后的弹跳反馈。
static egui_interpolator_bounce_t interp;
egui_interpolator_bounce_init((egui_interpolator_t *)&interp);
egui_animation_interpolator_set(EGUI_ANIM_OF(&anim), (egui_interpolator_t *)&interp);
Cycle – 周期运动¶
动画按正弦曲线做周期性运动。cycles 参数控制在动画时长内完成的周期数。
适用场景:震动提示、左右摇摆、呼吸灯效果。
static egui_interpolator_cycle_t interp;
egui_interpolator_cycle_init((egui_interpolator_t *)&interp);
// 设置周期数(如 2 个完整周期)
egui_interpolator_cycle_tension_set((egui_interpolator_t *)&interp, EGUI_FLOAT_VALUE(2.0f));
egui_animation_interpolator_set(EGUI_ANIM_OF(&anim), (egui_interpolator_t *)&interp);
插值器对照表¶
插值器 |
结构体 |
可调参数 |
运动特征 |
|---|---|---|---|
Linear |
|
无 |
匀速 |
Accelerate |
|
factor |
慢->快 |
Decelerate |
|
factor |
快->慢 |
AccelerateDecelerate |
|
无 |
慢->快->慢 |
Anticipate |
|
tension |
回拉->前进 |
Overshoot |
|
tension |
越过->回弹 |
AnticipateOvershoot |
|
tension |
回拉->越过->回弹 |
Bounce |
|
无 |
弹跳 |
Cycle |
|
cycles |
正弦周期 |
选型建议¶
通用过渡:AccelerateDecelerate 或 Decelerate
入场动画:Decelerate(平滑停止)或 Overshoot(弹性入场)
退场动画:Accelerate(加速离开)
物理模拟:Bounce(落地弹跳)
强调效果:AnticipateOvershoot(回拉+回弹)
持续动效:Cycle(周期运动)配合 repeat_count=-1
进度/加载:Linear(匀速填充)