跳跃的 CADisplayLink 动画
Posted
技术标签:
【中文标题】跳跃的 CADisplayLink 动画【英文标题】:Jumpy CADisplayLink Animation 【发布时间】:2013-06-24 15:57:57 【问题描述】:如前一篇文章 (Here) 中所述,我正在创建一个从初始角度开始并移动到结束角度的动画。我决定为这个动画使用CADisplayLink
,因为动画需要在用户输入期间尽可能快地运行,所以CALayer
和CAKeyframeAnimation
似乎实现这一点太慢了。
在实现调用setNeedsDisplay
的CADisplayLink
之后,我确实让动画工作了,但它看起来真的很糟糕,因为它将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
,所以我希望从initialAngle
到endAngle
的动画需要3.0 秒。我通过计算2*M_PI / kNumAnglesInAnimation
将整个圆(2*M_PI
弧度)分成相等的部分,最好我想为每一帧动画其中一个角度,但不知何故我仍然必须考虑kDrawDuration
和elapsedTime
,我只是不知道如何实现。
感谢您提供解决此问题的任何帮助!
【问题讨论】:
【参考方案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 来设置我圈子不同部分的持续时间。以上是关于跳跃的 CADisplayLink 动画的主要内容,如果未能解决你的问题,请参考以下文章
动画黄金搭档:CADisplayLink&CAShapeLayer
iOS 动画篇 CADisplayLink与CoreGraphics实现动画
iOS CoreAnimation 逐帧动画 CADisplayLink
iOS CoreAnimation 逐帧动画 CADisplayLink
动画黄金搭档:CADisplayLink & CAShapeLayer
使用 CADisplayLink“结合”与 CAMediaTimingFunction 为 UIView 设置动画。 (获得任意曲线)