从绿色到红色的颜色百分比

Posted

技术标签:

【中文标题】从绿色到红色的颜色百分比【英文标题】:Color from Green to Red with Percentage 【发布时间】:2014-09-19 22:27:28 【问题描述】:

我正在尝试根据百分比值创建从绿色到红色的自定义 UIColor,但我不知道我该怎么做?

有什么想法吗?

【问题讨论】:

类似this。 【参考方案1】:

如果你只是想要一个线性混合,那么沿着这些思路应该可以工作:

func mixGreenAndRed(greenAmount: Float) -> UIColor 
    return UIColor(red: (1.0 - greenAmount), green: greenAmount, blue: 0.0, alpha: 1.0)

不过,它会通过 RGB (0.5, 0.5, 0) 混合 - 一种难看的橙色 - 所以你可能想要这样做,它只会调整红色和绿色之间的色调,穿过黄色,然后让您根据自己的喜好改变饱和度/亮度:

func mixGreenAndRed(greenAmount: Float) -> UIColor 
    // the hues between red and green go from 0…1/3, so we can just divide percentageGreen by 3 to mix between them
    return UIColor(hue: greenAmount / 3, saturation: 1.0, brightness: 1.0, alpha: 1.0)

在这两种情况下,greenAmount 应该是介于 0.0–1.0 之间的值,而不是 0–100。

【讨论】:

什么是百分比绿色?【参考方案2】:

您可以使用我的扩展从颜色数组中按百分比获取中间颜色

extension Array where Element: UIColor 
    func intermediate(percentage: CGFloat) -> UIColor 
        let percentage = Swift.max(Swift.min(percentage, 100), 0) / 100
        switch percentage 
        case 0: return first ?? .clear
        case 1: return last ?? .clear
        default:
            let approxIndex = percentage / (1 / CGFloat(count - 1))
            let firstIndex = Int(approxIndex.rounded(.down))
            let secondIndex = Int(approxIndex.rounded(.up))
            let fallbackIndex = Int(approxIndex.rounded())

            let firstColor = self[firstIndex]
            let secondColor = self[secondIndex]
            let fallbackColor = self[fallbackIndex]

            var (r1, g1, b1, a1): (CGFloat, CGFloat, CGFloat, CGFloat) = (0, 0, 0, 0)
            var (r2, g2, b2, a2): (CGFloat, CGFloat, CGFloat, CGFloat) = (0, 0, 0, 0)
            guard firstColor.getRed(&r1, green: &g1, blue: &b1, alpha: &a1) else  return fallbackColor 
            guard secondColor.getRed(&r2, green: &g2, blue: &b2, alpha: &a2) else  return fallbackColor 

            let intermediatePercentage = approxIndex - CGFloat(firstIndex)
            return UIColor(red: CGFloat(r1 + (r2 - r1) * intermediatePercentage),
                           green: CGFloat(g1 + (g2 - g1) * intermediatePercentage),
                           blue: CGFloat(b1 + (b2 - b1) * intermediatePercentage),
                           alpha: CGFloat(a1 + (a2 - a1) * intermediatePercentage))
        
    

用法:

let color = [.green, .red].intermediate(percentage: 50)

还有更多颜色:

let color = [.green, .yellow, .red].intermediate(percentage: 70)

【讨论】:

这太棒了!正是我需要的。【参考方案3】:

我一直在寻找这样的东西,所以我自己写了。但我是 swift 的新手

static func successColor(percent: Int) -> UIColor 
    let p = CGFloat(percent)
    let tempR = (100.0-p)/100
    let r: CGFloat = tempR < 0 ? 0 : tempR
    let tempG = 1+(p-100.0)/100.0
    let g: CGFloat = tempG < 0 ? 0 : tempG
    return UIColor(red: r, green: g, blue: 0, alpha: 1)

【讨论】:

以上是关于从绿色到红色的颜色百分比的主要内容,如果未能解决你的问题,请参考以下文章

excel如何设置根据百分比进度自动改变颜色?

----颜色版----

如何使百分比指示器以编程方式在颤动中改变颜色?

使用 OpenCV 的 Python 图像中的颜色百分比

表格中1到4进度条怎么设置不同颜色?

Css3颜色值RGBA得表示方式