用渐变描边画一个圆

Posted

技术标签:

【中文标题】用渐变描边画一个圆【英文标题】:Drawing A Circle With Gradient Stroke 【发布时间】:2017-08-13 17:34:43 【问题描述】:

我正在处理一项任务,我必须创建一个没有填充但有渐变笔触的圆圈。供参考,这是我追求的最终结果;

鉴于该应用程序的其他情况,我正在画我的圆圈;

let c = UIGraphicsGetCurrentContext()!
c.saveGState()
let clipPath: CGPath = UIBezierPath(roundedRect: converted_rect, cornerRadius: converted_rect.width / 2).cgPath
c.addPath(clipPath)
c.setLineWidth(9.0)
c.setStrokeColor(UIColor.blue.cgColor)
c.closePath()
c.strokePath()
c.restoreGState()
let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

这会产生一个带有蓝色笔划的圆圈。尽管围绕 SO 进行了很多搜索,但我仍在努力弄清楚如何将 setStrokeColor 替换为渐变而不是蓝色。我最大的成功来自于创建一个CAGradientLayer,然后用从路径创建的CAShapeLayer 掩盖它,但我只能创建一个实心圆,而不是一个空心圆。

谢谢!

【问题讨论】:

在这种情况下,带有适当蒙版的渐变层是否有效? @solenoid 我试过了,但效果有限。这让我得到了一个带有渐变的实心圆,但不是一个带有渐变笔触的圆。 你看过these search results吗? 嗯,面具是一种 2 路径 - 一个里面一个外面 @rmaddy 我有。我似乎无法转换逻辑的地方是如何在上下文中绘制任何类型的圆/渐变,而不是添加到视图的图层,这在我的情况下是不切实际的。 【参考方案1】:

基本思路是用你的路径作为剪切路径,然后绘制渐变。

let c = UIGraphicsGetCurrentContext()!
let clipPath: CGPath = UIBezierPath(ovalIn: converted_rect).cgPath

c.saveGState()
c.setLineWidth(9.0)
c.addPath(clipPath)
c.replacePathWithStrokedPath()
c.clip()

// Draw gradient
let colors = [UIColor.blue.cgColor, UIColor.red.cgColor]
let offsets = [ CGFloat(0.0), CGFloat(1.0) ]
let grad = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: colors as CFArray, locations: offsets)
let start = converted_rect.origin
let end = CGPoint(x: converted_rect.maxX, y: converted_rect.maxY)
c.drawLinearGradient(grad!, start: start, end: end, options: [])

c.restoreGState()

let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

首先使用所需颜色设置CGGradient。然后对于线性渐变,您使用drawLinearGradient。对于径向渐变,请使用drawRadialGradient

【讨论】:

我已经尝试过了,但实际上没有绘制任何内容。线性渐变如何理解它与剪辑路径有任何关联? 一切都取决于您如何设置CGGradient 并使用drawLinearGradientdrawRadialGradient 绘制它。 宾果游戏,@rmaddy!这非常有效。感谢您提供完整的答案,这正是我所追求的。你摇滚! 很好的答案!对我帮助很大!

以上是关于用渐变描边画一个圆的主要内容,如果未能解决你的问题,请参考以下文章

怎样用PS制作色阶,色相环,回答满意的加10分

放射感背景

Android studio - 渐变背景和描边

如何在 TextView Android 中将渐变设置为文本颜色以及在其周围添加描边?

如何给SVG填充和描边应用线性渐变

如何给SVG填充和描边应用线性渐变