我在 iOS 中沿着 CGPath
(QuadCurve)很好地制作了一个 CALayer
动画。但我想使用一个比苹果公司的少数 提供(EaseIn/EaseOut 等)更有趣的宽松功能。例如,弹跳或弹性功能。
These things are possible to do with MediaTimingFunction (bezier):
但我想创建更复杂的 计时功能。问题是,媒体的时机选择似乎需要一个立方贝塞尔,而这个立方贝塞尔的力量不足以产生这些效果:
(source: sparrow-framework.org)
在其他框架中,创建以上代码的 密码非常简单,这使得它非常令人沮丧。请注意,曲线是映射输入时间到输出时间(T-t 曲线) ,而不是时间位置曲线。例如,EaseOutBounce (T) = t返回一个新的 T。然后,使用 T绘制运动(或者我们应该动画的任何属性)。
因此,我想创建一个复杂的自定义 CAMediaTimingFunction
,但我不知道如何做到这一点,或者它是否可能?还有别的选择吗?
编辑:
这里有一个具体的例子,非常有教育意义:)
我想要动画一个物体沿着一条线从点 一到 B,但我希望它沿着线“反弹”它的运动使用上面的 easeOutBounce 曲线。这意味着它将遵循从 一到 B的精确路线,但是将以比使用当前基于 bezier 的 CAMediaTimingfunction 更复杂的方式加速和减速。
让我们用 CGPath 指定任意曲线移动该直线。它仍然应该沿着这条曲线移动,但是它应该以与线性示例相同的方式加速和减速。
理论上,我认为应该是这样的:
让我们将运动曲线描述为一个关键帧动画 move(t) = p,其中 T是时间[0。。1] ,P是在时间 T计算的位置。因此,move(0)返回曲线开始的位置,移动(0.5)返回曲线中间的位置,而 移动(1)返回曲线结束的位置。使用一个计时函数 时间(T) = t提供 让开的 T值应该可以给我我想要的。对于弹跳效果,计时函数应该返回相同的 T1和 T1的 T值(只是一个例子)。只要替换定时函数就可以得到不同的效果。
(是的,可以通过创建和连接来回移动的四个线段来进行线弹跳,但这应该没有必要。毕竟,它只是一个将 时间值映射到位置的简单线性函数。)
我希望我说的有道理。