如何计算具有已知起始速度和距离的UIViewAnimationCurveEaseOut动画的持续时间?

时间:2009-12-24 08:17:29

标签: iphone cocoa-touch animation core-animation easing-functions

我使用UIViewAnimationCurveLinear为两点之间的视图设置动画,所以我知道这个动画的速度。在某些情况下,我想附加一个UIViewAnimationCurveEaseOut来使视图慢慢停止。要使此效果无缝,缓出动画必须以与之前的线性动画相同的速度开始。给定我想要缓和的固定距离,如何计算达到这个已知起始速度所需的持续时间?

例如,假设我在10秒内将我的视图从x = 0设置为x = 100。因此速度为10像素/秒。我现在希望视图使用UIViewAnimationCurveEaseOut动画从x = 100减速到x = 120。该动画的持续时间应确保以10像素/秒开始?

据我所知,Core Animation的CAMediaTimingFunction使用三次贝塞尔曲线控制动画调步,其中第二和第三控制点决定曲线的形状。我认为UIViewAnimationCurve缓动函数也是三次贝塞尔曲线。如果我知道这些函数使用的默认控制点,我应该能够计算公式来计算给定速度和距离的持续时间,但我没有设法在任何地方找到这些默认控制点。

2 个答案:

答案 0 :(得分:1)

我可能无法给你一个完整的答案,但我可以指向CAMediaTimingFunction的-getControlPointAtIndex:values:方法。这应该让你创建一个EaseOut计时功能,然后检查它的控制点。

我还会向您指出article by Matt Gallagher关于使用CAKeyframeAnimation完成的自定义加速度曲线,这也可能对您有用。

答案 1 :(得分:0)

你可以使用一个常数(称之为BEZIER_INTEGRAL_CONSTANT)来近似贝塞尔曲线的积分,以1秒/秒的速度开始1秒长的动画。对于线性缓动,此常量为0.5。对于UIViewAnimationCurveEaseOut约为 0.7。持续时间的公式是:

duration = distance / (velocity * BEZIER_INTEGRAL_CONSTANT)

对于您的示例,距离为20像素,起始速度为10像素/秒,持续时间应约为:20 / (10 * 0.7) = 2.9 seconds