用核心图形画一个羽化圆
Posted
技术标签:
【中文标题】用核心图形画一个羽化圆【英文标题】:Draw a feathered circle with core graphics 【发布时间】:2013-11-12 20:59:42 【问题描述】:使用核心图形,我将如何绘制一个朝向中心增加 alpha 值的羽化圆?像这样的:
理想情况下,颜色、圆半径和 alpha 强度将是参数。
【问题讨论】:
你能举一个你迄今为止尝试过的例子吗? 我尝试使用 CGContextFillEllipseInRect 填充颜色,其 alpha 值增加,矩形变小,但我在圆上发现明显的间隙和伪影。 【参考方案1】:这在我的一些应用中对我有用。柔软度为 0-1。您需要自己制作一个宽度和高度为宽度(正方形)的 CGBitmapContext。
// make a path:
self.shapePath = CGPathCreateMutable();
CGPathAddEllipseInRect(self.shapePath, NULL, CGRectMake(0, 0, width, width));
CGFloat radius = width / 2.0f;
NSInteger innerRadius = (softness < 0.01f ? (NSInteger)radius : (NSInteger)ceil((1.0f - softness) * radius));
NSInteger outerRadius = (NSInteger)ceil(radius);
CGFloat alphaStep = MAX(0.0059f, (1.0f / ((outerRadius - innerRadius) + 1)));
CGFloat outerMultiplier = 1.0f / (2.0f * (CGFloat)outerRadius);
for (NSInteger i = outerRadius; i >= innerRadius; --i)
CGContextSaveGState(bitmapContext);
UIColor* c = [UIColor.whiteColor colorWithAlphaComponent:alphaStep];
CGContextTranslateCTM(bitmapContext, outerRadius - i, outerRadius - i);
CGFloat scale = (2.0f * (CGFloat)i) * outerMultiplier;
CGContextScaleCTM(bitmapContext, scale, scale);
CGContextSetFillColorWithColor(bitmapContext, c.CGColor);
CGContextAddPath(bitmapContext, self.shapePath);
CGContextEOFillPath(bitmapContext);
CGContextRestoreGState(bitmapContext);
【讨论】:
【参考方案2】:您可以使用 Core Graphics CGGradientRef
和 CGContextDrawRadialGradient
() 函数,也可以使用 Core image CIRadialGradient
过滤器。您使用哪一种取决于您的需求。
【讨论】:
以上是关于用核心图形画一个羽化圆的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 中使用核心图形上下文绘制圆 - Objective-C 或 Swift