2013-04-25 55 views
4

我希望图层从绿色开始,然后慢慢变成黄色,橙色,最后变成红色。我该怎么做呢?如何在动画过程中更改CALayer的颜色?

CAShapeLayer *layer = [CAShapeLayer layer]; 
[layer setStrokeColor:[UIColor greenColor].CGColor]; 
[layer setLineWidth:5.0f]; 
[layer setFillColor:[UIColor clearColor].CGColor]; 

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:button.bounds cornerRadius:10.0f]; 
layer.path = path.CGPath; 

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; 
animation.fromValue = [NSNumber numberWithFloat:0.0f]; 
animation.toValue = [NSNumber numberWithFloat:1.0f]; 
animation.duration = 4.0f; 

[layer addAnimation:animation forKey:@"myStroke"]; 
[button.layer addSublayer:layer]; 

回答

5

我刚刚为你写了这段代码。我使用了CAKeyframeAnimation,因为它允许多个toValues,并且它允许对动画进行更多的控制。

//Set up layer and add it to view 
CALayer *layer = [CALayer layer]; 
layer.frame = self.view.bounds; 
[self.view.layer addSublayer:layer]; 

//Create animation 
CAKeyframeAnimation *colorsAnimation = [CAKeyframeAnimation animationWithKeyPath:@"backgroundColor"]; 
colorsAnimation.values = [NSArray arrayWithObjects: (id)[UIColor greenColor].CGColor, 
          (id)[UIColor yellowColor].CGColor, (id)[UIColor orangeColor].CGColor, (id)[UIColor redColor].CGColor, nil]; 
colorsAnimation.keyTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.25], [NSNumber numberWithFloat:0.5], [NSNumber numberWithFloat:0.75],[NSNumber numberWithFloat:1.0], nil]; 
colorsAnimation.calculationMode = kCAAnimationPaced; 
colorsAnimation.removedOnCompletion = NO; 
colorsAnimation.fillMode = kCAFillModeForwards; 
colorsAnimation.duration = 3.0f; 

//Add animation 
[layer addAnimation:colorsAnimation forKey:nil]; 
2

使用CAKeyframeAnimation是确定的,但有时你需要更简单的东西。以下是使用CABasicAnimation和3行代码的方法。

CABasicAnimation *colorAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"]; 
colorAnimation.toValue = (id)[UIColor redColor].CGColor; 

[layer addAnimation:colorAnimation forKey:nil];