使用核心动画层绘制锥形或弧形渐变

6
我需要使用核心动画绘制一个圆形线并用渐变填充。这不是什么大问题,因为我正在使用CAGradientLayer,并将其与CAShapeLayer进行掩蔽。问题在于渐变应该像这个主题中所看到的那样。
已经有很多解决方案了,但让我解释一下它们为什么对我不起作用:
- 我不能使用图像,因为我需要动画化CAGradientLayer的位置属性数组。 - 我没有使用Core Graphics来绘制所有内容,因为正如我所说,我试图绘制的圆中几乎所有东西都可以动画化。 - 可用的这里类是一个可能的解决方案,但并不理想,因为它需要为我需要绘制的每个圆创建一个新视图,这对我来说不是最佳选择(如果没有其他解决方案,我可能会使用这个)。 - 我不能使用这个问题中的解决方案,因为它仅适用于简单的双色渐变。
这是我用来绘制圆的代码:
int radius = 100;
CAShapeLayer *circle = [CAShapeLayer layer];
circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(50, 60, 2.0*radius,    2.0*radius)cornerRadius:radius].CGPath;

circle.lineWidth = 10;
circle.fillColor = [UIColor clearColor].CGColor;
circle.strokeColor = [UIColor blackColor].CGColor;



CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = CGRectMake(50, 60, 300, 300);
gradientLayer.startPoint = CGPointMake(0.5,1.0);
gradientLayer.endPoint = CGPointMake(0.5,0.0);
gradientLayer.frame = CGRectMake(0, 0, 300, 300);
NSMutableArray *colors = [NSMutableArray array];
NSMutableArray *locations = [NSMutableArray array];
[colors addObject:(id)[[UIColor colorWithRed:134.0/255.0 green: 234.0/255.0   blue:63.0/255.0 alpha:1.0] CGColor]];
[colors addObject:(id)[[UIColor colorWithRed:215.0/255.0 green: 82.0/255.0 blue:76.0/255.0 alpha:1.0] CGColor]];
[colors addObject:(id)[[UIColor colorWithRed:28.0/255.0 green:28.0/255.0 blue:28.0/255.0 alpha:1.0] CGColor]];
[locations addObject:(id)[NSNumber numberWithFloat:0.2]];
[locations addObject:(id)[NSNumber numberWithFloat:0.5]];
[locations addObject:(id)[NSNumber numberWithFloat:0.8]];
gradientLayer.colors = colors;
gradientLayer.locations = locations;
[gradientLayer setMask:circle];

[sender.layer addSublayer:gradientLayer];
1个回答

2
我建议使用自定义Core Image滤镜来解决这个问题。
对于每个像素,您可以计算出从过滤图像中心的角度。将此角度转换为0.0到1.0之间的值。使用这些值,您可以将颜色值映射到计算的像素上。
如果您编写这个“Core Image Kernel Language”,它应该处理得非常快。您可以使用核心动画来动画化输入值,以动画化生成的渐变。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接