|
如果学习过《一步一步学习使用FireMonkey动画》系列的前几课,可以看到不止一次的使用了动画的Interpolation属性指定插值。
插值(Interpolation),在数学和计算机图形学中,是一种在两个已知值之间估算中间值的方法。简单来说,就是给定一个起点 A 和一个终点 B,插值能计算出从 A 到 B 的平滑过渡中的所有“中间点”。
一个生活中的例子:
假设你想从房间的左边(位置 X=0)走到右边(位置 X=100)。
起点 A: X = 0
终点 B: X = 100
时间: 10 秒
如果你不是瞬间移动过去的,那么在第 1 秒、第 2 秒... 第 9 秒时,你会在某个中间位置。计算这些中间位置的过程就是插值。最简单的插值是线性插值,即匀速运动:
第 1 秒:X = 10
第 2 秒:X = 20
...
第 5 秒:X = 50
第 10 秒:X = 100
这是让动画效果丰富多彩的关键。
FireMonkey 提供了多种插值函数,它们决定了数值变化的“缓动”效果(Easing)。
-
Linear(线性): 最简单的插值,匀速变化。
计算公式:Value = Start + (End - Start) * (CurrentTime / Duration)
-
Quadratic(二次方): 缓慢开始,然后加速(Ease In);或快速开始,然后减速(Ease Out)。
-
Cubic(三次方)、Quartic(四次方)、Quintic(五次方): 与二次方类似,但效果更强烈。
-
Sinusoidal(正弦曲线): 创建一个类似正弦波的平滑加速和减速。
-
Exponential(指数): 以指数方式变化,产生非常强烈的加速或减速效果。
-
Elastic(弹性): 在终点附近会有“回弹”效果,像一根橡皮筋。
-
Bounce(弹跳): 在终点处像球落地一样弹跳几下。
-
Back(回拉): 在开始运动前会先稍微向后(反向)运动一点。
这些类型通常都有 In, Out, InOut 三种模式,分别控制效果应用于动画的开始、结束还是整个过程。这也是为动画的AnimationType属性指定的三种值的作用。
动画图解11种线性插值
说实话很难通过语言来介绍这种插值的效果,只有通过动画才能加深印象,这里使用了《Delphi GUI Programming with FireMonkey》中的一个Playground示例程序,来一步一步的演示每一种插值类型。
1. Linear(线性插值)
2. Quadratic(二次插值)
-
描述:基于二次方函数 (t²) 的插值。它提供了明显的加速或减速效果,比线性动画看起来更自然。
-
In 模式:缓慢开始,然后加速到终点。
-
Out 模式:快速开始,然后减速到终点。
-
InOut 模式:结合两者,缓慢开始,中间加速,最后减速。
-
数学曲线:抛物线。
-
适用场景:非常通用,适用于大多数 UI 元素的入场和退场动画。例如,按钮点击、菜单滑入滑出、卡片弹出等。
3. Cubic(三次插值)
4. Quartic(四次插值)
5. Quintic(五次插值)
-
描述:基于五次方函数 (t⁵) 的插值。这是“幂函数”插值家族(Quadratic, Cubic, Quartic, Quintic)中最强力的一种。它在开始和结束时几乎完全静止,中间有极其短暂的剧烈变化。
-
数学曲线:最陡峭的“S”形曲线。
-
适用场景:创造戏剧性的、能量积聚后瞬间释放的效果。在日常 UI 交互中很少使用。
6. Sinusoidal(正弦插值)
7. Exponential(指数插值)
8. Circular(圆形插值)
-
描述:基于圆形函数 (sqrt(1-t²)) 的插值。它产生一种独特的慢入快出或快入慢出效果,其运动轨迹类似于四分之一圆弧。
-
In 模式:慢入快出,像从弧线顶端滑落。
-
Out 模式:快入慢出,像沿着弧线向上滚动到停止。
-
数学曲线:圆形弧线。
-
适用场景:创造一种有趣、俏皮的动画风格,常见于一些游戏 UI 或希望展现轻松活泼氛围的应用中。
9. Elastic(弹性插值)
10. Back(回拉插值)
11. Bounce(弹跳插值)
总结与选择建议
| 插值类型 (InterpolationType) |
核心特点 |
适用场景 |
| Linear |
匀速、机械 |
进度条、数值变化 |
| Quadratic |
自然加速/减速 |
通用UI交互(首选) |
| Cubic |
更强烈的加速/减速 |
流畅的页面过渡 |
| Quartic/Quintic |
极其强烈的加速/减速 |
戏剧化、能量爆发效果 |
| Sinusoidal |
非常平滑、柔和 |
淡入淡出、柔和变化 |
| Exponential |
急剧、瞬间变化 |
爆炸、脉冲、强提醒 |
| Circular |
圆弧运动 |
俏皮、有趣的动画 |
| Elastic |
弹簧振荡、过冲 |
有弹性的UI反馈 |
| Back |
先回拉再前进 |
蓄力动作、提示性动画 |
| Bounce |
落地弹跳 |
庆祝、完成状态 |
来源:https://www.cnblogs.com/lincats/p/19055376 |