我需要使用
CADisplayLink
在 SwiftUI 中手动逐帧制作动画,这为我提供了逐帧更新。要以线性方式将值从 a
动画化到 b
,实现很简单,只需使用 (b-a) / duration
计算变化率并将此增量应用于每一帧上的值。
但是,我没有找到任何有关当动画不是线性时如何进行帧到帧更新的信息。当然,我可以使用 numeric 包等方式自己创建缓动函数,但对于需要如此多手动实现的用例来说,这似乎太常见了。
Apple 开箱即用的缓动功能在哪里?应该有一个缓动函数包,允许我使用
y
检索 x
,但这篇 post 表明没有?
如果您可以使用 SwiftUI 并且最低部署版本为 iOS 17,则可以使用 UnitCurve。
由二维曲线定义的函数,将 [0,1] 范围内的输入进度映射到也在 [0,1] 范围内的输出进度。通过改变曲线的形状,可以改变动画或其他插值的有效速度。
您可以传入一个进度,即已播放动画的百分比,然后获取一个新的进度值,以在计算动画值的当前状态时使用。
let newProgress = UnitCurve.easeInOut.value(at: progress)
let newValue = a + (b - a) * newProgress
如果您需要一些其他动画曲线,https://easings.net/是常用曲线的一个很好的参考。它还包括在每页底部生成曲线的数学。