说明
首先,我的答案是这个Calculate color values from green to red的改编版本。我决定创建一个Java版本的那个JavaScript解决方案。代码可以直接插入您的代码中,无需自己转移。
使用HSL(色相、饱和度、亮度)颜色空间代替RGB(红、绿、蓝)。在这里,红色由色相值0°
表示,绿色由120°
表示,在60°
处有黄色,并且在色相方面具有平滑过渡:
我们将固定饱和度为100%
和亮度为50%
,但如果您喜欢,可以尝试这些值。
用法
以下是您在代码中使用它的方式:
// A value between 1.0 (green) to 0.0 (red)
double percentage = ...
// Get the color (120° is green, 0° is red)
Color color = transitionOfHueRange(percentage, 120, 0);
以下是所得到的范围:
其他方法
这里是 transitionOfHueRange
方法。它接受一个 percentage
值,介于 0.0
和 1.0
之间,以及一个 hue
范围,介于 0
和 360
之间:
public static Color transitionOfHueRange(double percentage, int startHue, int endHue) {
double hue = ((percentage * (endHue - startHue)) + startHue) / 360;
double saturation = 1.0;
double lightness = 0.5;
return hslColorToRgb(hue, saturation, lightness);
}
这是“hslColorToRgb”函数,它接受从0.0到1.0之间的
HSL值:
public static Color hslColorToRgb(double hue, double saturation, double lightness) {
if (saturation == 0.0) {
int grey = percToColor(lightness);
return new Color(grey, grey, grey);
}
double q;
if (lightness < 0.5) {
q = lightness * (1 + saturation);
} else {
q = lightness + saturation - lightness * saturation;
}
double p = 2 * lightness - q;
double oneThird = 1.0 / 3;
double red = percToColor(hueToRgb(p, q, hue + oneThird));
double green = percToColor(hueToRgb(p, q, hue));
double blue = percToColor(hueToRgb(p, q, hue - oneThird));
return new Color(red, green, blue);
}
hueToRgb方法:
public static double hueToRgb(double p, double q, double t) {
if (t < 0) {
t += 1;
}
if (t > 1) {
t -= 1;
}
if (t < 1.0 / 6) {
return p + (q - p) * 6 * t;
}
if (t < 1.0 / 2) {
return q;
}
if (t < 2.0 / 3) {
return p + (q - p) * (2.0 / 3 - t) * 6;
}
return p;
}
最后是小实用方法percToColor
:
public static int percToColor(double percentage) {
return Math.round(percentage * 255);
}