4

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

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

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

4

2 回答 2

1

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

我还将向您介绍 Matt Gallagher 撰写的一篇关于使用 CAKeyframeAnimation 完成的自定义加速曲线的文章,这也可能对您有用。

于 2010-07-13T14:04:29.237 回答
0

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

duration = distance / (velocity * BEZIER_INTEGRAL_CONSTANT)

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

于 2014-12-13T22:29:50.290 回答