【问题标题】:Jumpy CADisplayLink Animation跳跃的 CADisplayLink 动画
【发布时间】:2013-06-24 15:57:57
【问题描述】:

如前一篇文章 (Here) 中所述,我正在创建一个从初始角度开始并移动到结束角度的动画。我决定为这个动画使用CADisplayLink,因为动画需要在用户输入期间尽可能快地运行,所以CALayerCAKeyframeAnimation 似乎实现这一点太慢了。

在实现调用setNeedsDisplayCADisplayLink 之后,我确实让动画工作了,但它看起来真的很糟糕,因为它将endAngle 和initialAngle 之间的差异分成了非常明显的角度块,而不是创建一个连续的流从一个角度到另一个角度。这是我目前的代码:

CGFloat newAngleToAnimate = animationProgress + ((endAngle-initialAngle)/kDrawDuration)*elapsedTime;

// Use newAngleToAnimate to draw in drawInContext

animationProgress = newAngleToAnimate; // Update the progress for the next frame.

另外,kDrawDuration 定义为3.0f,所以我希望从initialAngleendAngle 的动画需要3.0 秒。我通过计算2*M_PI / kNumAnglesInAnimation 将整个圆(2*M_PI 弧度)分成相等的部分,最好我想为每一帧动画其中一个角度,但不知何故我仍然必须考虑kDrawDurationelapsedTime ,我只是不知道如何实现。

感谢您提供解决此问题的任何帮助!

【问题讨论】:

    标签: ios caanimation cakeyframeanimation cadisplaylink


    【解决方案1】:
    CGFloat newAngleToAnimate = animationProgress + ((endAngle-initialAngle)/kDrawDuration)*elapsedTime;
    

    不要跟踪“animationProgress”。您的 elapsedTime 是您使动画正确所需的全部。所以只需删除它并使用:

    CGFloat newAngleToAnimate = ((endAngle-initialAngle)/kDrawDuration)*elapsedTime;

    【讨论】:

    • 我试过了,但动画不正确。我应该注意,我对elapsedTime 使用以下计算:CFTimeInterval elapsedTime = _displayLink.timestamp - lastDrawTime; 不过,谢谢。
    • 您需要记录自开始绘图以来的时间(第一次绘图时间),而不是自上次绘图以来的时间 (lastDrawTime)
    • 有趣,谢谢,我会试试这个,让你知道它是如何工作的!
    • 所以它确实有效,但它的移动方式看起来仍然很“笨拙”,这让我想知道它是否与 newAngleToAnimate 计算无关。如果我将 2pi 划分为 300 个不同的部分,每个部分之间的角度相同,是否应该在 CADisplayLink 上设置一些设置,例如 frameInterval 以使其不能尽可能快地运行或其他什么?
    • 我想我意识到了问题所在:无论 endAngle-initialAngle 是什么,我的动画持续时间都是相同的。所以当 endAngle-initialAngle 小于大约 2pi/3 时它看起来很完美,但之后动画持续时间太短,不适合大 endAngle。所以我认为我最终会做的是一个 switch case 来设置我圈子不同部分的持续时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 2021-04-27
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    相关资源
    最近更新 更多