Mac OS: CAAnimation - 无缝更新动画
Mac OS: CAAnimation - seamlessly update the animation
我正在制作自定义 UI 元素,我需要对其进行动画处理。问题是在某些时候我需要更新我的动画,但是当我更新它时,当前动画位置(状态)和新动画之间存在可见的 lag/gap。
换句话说,当我应用新动画时,这个动画从0位置(状态)开始,而前一个动画的实际(可见)状态是不同的。
示例如下:(link)
<blockquote class="imgur-embed-pub" lang="en" data-id="a/q3NA31f"><a href="//imgur.com/q3NA31f"></a></blockquote><script async src="//s.imgur.com/min/embed.js" charset="utf-8"></script>
动画代码:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
anim.duration = time;
anim.repeatCount = INFINITY;
anim.fromValue = from;
anim.byValue = by;
[self.myLayer addAnimation:anim forKey:kActivityAnimationKey];
首次应用的动画具有不同的 time/from/by 参数。
任何 的建议将不胜感激,因为我坚持了两天并尝试了此时出现的所有问题。
我能够完成这个任务,我将对这个问题给出一个笼统的答案。
如果您想更新当前正在进行的动画,但您正处于其中,则需要将当前动画替换为将在正确位置结束当前动画的动画。
例如,在我的问题中有一个动画有 fromValue
和 byValue
。这意味着,如果您以不同的持续时间启动相同的动画,它会将其当前旋转状态更改为 fromValue
.
要修复此行为,我们需要添加动画,以完成从当前旋转状态到 fromValue
的动画。要获得当前的旋转,或其他 属性 您需要的动画,我们有 presentationLayer
的 CALayer。我们可以将它的值设置为我们的 "closing" 动画。
我们如何知道关闭动画何时结束?答案是CAAnimationDelegate。只需为结束动画设置一个委托,完成后添加另一个具有不同参数的动画。您现在可以无缝更新您的动画了。
请记住,关闭动画时间必须是原始动画时间的一小部分才能使事情顺利进行。你可以这样计算:(end state - current state) * original duration
.
我正在制作自定义 UI 元素,我需要对其进行动画处理。问题是在某些时候我需要更新我的动画,但是当我更新它时,当前动画位置(状态)和新动画之间存在可见的 lag/gap。
换句话说,当我应用新动画时,这个动画从0位置(状态)开始,而前一个动画的实际(可见)状态是不同的。
示例如下:(link)
<blockquote class="imgur-embed-pub" lang="en" data-id="a/q3NA31f"><a href="//imgur.com/q3NA31f"></a></blockquote><script async src="//s.imgur.com/min/embed.js" charset="utf-8"></script>
动画代码:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
anim.duration = time;
anim.repeatCount = INFINITY;
anim.fromValue = from;
anim.byValue = by;
[self.myLayer addAnimation:anim forKey:kActivityAnimationKey];
首次应用的动画具有不同的 time/from/by 参数。
任何 的建议将不胜感激,因为我坚持了两天并尝试了此时出现的所有问题。
我能够完成这个任务,我将对这个问题给出一个笼统的答案。
如果您想更新当前正在进行的动画,但您正处于其中,则需要将当前动画替换为将在正确位置结束当前动画的动画。
例如,在我的问题中有一个动画有 fromValue
和 byValue
。这意味着,如果您以不同的持续时间启动相同的动画,它会将其当前旋转状态更改为 fromValue
.
要修复此行为,我们需要添加动画,以完成从当前旋转状态到 fromValue
的动画。要获得当前的旋转,或其他 属性 您需要的动画,我们有 presentationLayer
的 CALayer。我们可以将它的值设置为我们的 "closing" 动画。
我们如何知道关闭动画何时结束?答案是CAAnimationDelegate。只需为结束动画设置一个委托,完成后添加另一个具有不同参数的动画。您现在可以无缝更新您的动画了。
请记住,关闭动画时间必须是原始动画时间的一小部分才能使事情顺利进行。你可以这样计算:(end state - current state) * original duration
.