【问题标题】:How can I compute the duration for a UIViewAnimationCurveEaseOut animation with a known starting velocity and distance?如何计算具有已知起始速度和距离的 UIViewAnimationCurveEaseOut 动画的持续时间?
【发布时间】:2009-12-24 08:17:28
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么不在整个动画中使用 EaseOut?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    对于以 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 2018-07-03
      • 2014-04-04
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多