CALayer 不透明度动画

Posted

技术标签:

【中文标题】CALayer 不透明度动画【英文标题】:CALayer opacity animation 【发布时间】:2012-09-09 01:18:48 【问题描述】:

我想创建一个 CALayer 动画,它会产生一种“华丽”的效果。为此,我正在尝试为“不透明度”属性设置动画,但我的问题是我不知道从哪里开始以及如何做。

下面是动画的图解说明:

opacity
   |    ___
1  |   |   |
   |   |   |    * repeatCount
0  |___|   |_ . . .
   -------------------------> time
    |______|
    duration

不透明度从 0 开始,然后动画到 1,然后再到 0(这个 0 到 1 到 0 的动画需要的秒数等于持续时间)。然后这个过程被重复 'repeatCount' 次。

以下是代码的一些背景:

float duration = ...; // 0.2 secs, 1 sec, 3 secs, etc
int repeactCount = ...; // 1, 2, 5, 6, ect

CALayer* layer = ...; // I have a CALayer from another part of the code
layer.opacity = 0;

// Animation here

done = YES; // IN THE END of the animation set this ivar to yes

完成此任务的最佳方法是什么?我以前从未使用过 CALayers,所以这也是了解他们的动画系统如何工作的好机会。顺便说一句,我搜索了文档,我了解您如何添加一两个简单动画,但我不知道如何执行此特定动画。

【问题讨论】:

支持图表 XD 【参考方案1】:

实现这一点的最佳方法是使用显式动画(参见guide),方法是创建CABasicAnimation 的实例并将其添加到图层。

代码如下所示:

CABasicAnimation *flash = [CABasicAnimation animationWithKeyPath:@"opacity"];
flash.fromValue = [NSNumber numberWithFloat:0.0];
flash.toValue = [NSNumber numberWithFloat:1.0];
flash.duration = 1.0;        // 1 second
flash.autoreverses = YES;    // Back
flash.repeatCount = 3;       // Or whatever

[layer addAnimation:flash forKey:@"flashAnimation"];

如果您想知道动画何时完成,您可以设置一个委托并实现animationDidStop:finished: 方法,但是最好使用完成块,因为它允许所有代码在同一个位置。如果您正在为 ios 4 或 OS X 编写代码,那么您可以使用出色的 CAAnimationBlocks 类别来完成此操作。

【讨论】:

谢谢!这完美无缺。只有一件事:它是'animationWithKeyPath:' @Alex 好的,我会更新答案(它来自记忆 - 并不总是最可靠的来源......) 我不明白。它淡入,然后立即消失。 @***foe 是“指南”应该链接到这里吗? developer.apple.com/library/archive/documentation/Cocoa/…【参考方案2】:

***foe 的回答非常好。我只想补充一点,如果您想更好地控制“时间线”(淡出需要多长时间?然后我们应该等待多长时间?那么淡入需要多长时间?等等)你是想要将多个 CABasicAnimations 组合成一个 CAAnimationGroup。

您可能想阅读我的书中关于这个主题的章节,其中最后一部分是关于 CAAnimation 及其后代的教程:

http://www.apeth.com/iOSBook/ch17.html#_core_animation

请注意,我的讨论是针对 iOS 的;在 Mac OS X 上,如果您是这样的话,视图/层架构会有些不同,但它所说的 CAAnimation 仍然是正确的。

【讨论】:

以上是关于CALayer 不透明度动画的主要内容,如果未能解决你的问题,请参考以下文章

如何为 CALayer 使用基于块的动画?

CALayer.opacity 在 CATransaction 内没有动画

在核心动画中移除或隐藏图层时移除不透明度和时间间隔

具有多个参数的动画视图

使用 CALayer 显示 alpha 映射图像

带有透明孔的 CALayer