CALayer的不透明度动画(CALayer opacity animation)

2019-07-31 15:23发布

我想创建一个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,所以这也是学习他们的动画系统是如何工作的好机会。 顺便说一句,我已经搜查了文档,我知道你是如何增加一个或两个简单的动画,但我不知道如何做到这一点特别的一个。

Answer 1:

要做到这一点,最好的方法是使用一个明确的动画(见指南创建的实例) 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类别来做到这一点。



Answer 2:

Trojanfoe的答案是优秀的。 我只想补充一点,如果你想在“时间线”更多的控制(应该需要多长时间淡出?多久,我们应该再等待?那么多长时间,要花淡入?等等),你会想多合并CABasicAnimation s转换为CAAnimationGroup。

你可能需要阅读关于这个主题我的书章,该章的最后部分,构成了对CAAnimation及其后代的教程:

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

请注意,我的讨论是针对iOS的; 在Mac OS X,如果这是你身在何处,视图/层架构是一个有点不同,但它说什么关于CAAnimation仍然是正确的。



文章来源: CALayer opacity animation