【发布时间】:2014-08-21 07:49:30
【问题描述】:
有没有办法沿着渐变计算颜色?
例如,我有一个标签,用作一种带有渐变背景的状态栏,一端为绿色 (#6bba70),另一端为红色 (#a90329)。我想做的是弄清楚渐变中某个点的颜色是什么。例如,如果该过程完成了 27%,我想获得“沿渐变的 27%”的颜色。像这样:
我想也许我可以找到数字偏移,它会给我正确的颜色。我写的代码(不起作用):
public static String getHTML(Date d, int shift) throws SQLException, ClassNotFoundException {
String returnValue = "";
returnValue += " <style type=\"text/css\">\n"
+ " \n"
+ " .status{\n"
+ " filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6bba70', endColorstr='" + getColor(77) + "',GradientType=1 );\n"
+ " width: " + 500 * .77 + "px;\n"
+ " height: 5px;\n"
+ " border: thin black solid;\n"
+ " }\n"
+ " .status2{\n"
+ " filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6bba70', endColorstr='" + getColor(100) + "',GradientType=1 );\n"
+ " width: " + 500 + "px;\n"
+ " height: 5px;\n"
+ " border: thin black solid;\n"
+ " }\n"
+ " .status3{\n"
+ " filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6bba70', endColorstr='" + getColor(33) + "',GradientType=1 );\n"
+ " width: " + 500 * .33 + "px;\n"
+ " height: 5px;\n"
+ " border: thin black solid;\n"
+ " }\n"
+ " .status4{\n"
+ " filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6bba70', endColorstr='" + getColor(69) + "',GradientType=1 );\n"
+ " width: " + 500 * .69 + "px;\n"
+ " height: 5px;\n"
+ " border: thin black solid;\n"
+ " }\n"
+ " </style>"
+ " <body>\n"
+ " 77% <label class=\"status\"></label><br><br>\n"
+ " 100% <label class=\"status2\"></label><br><br>\n"
+ " 33% <label class=\"status3\"></label><br><br>\n"
+ " 69% <label class=\"status4\"></label><br><br>\n"
+ " </body>";
return returnValue;
}
private static String getColor(double percentage) {
String colorValue = "";
int[] rgb1 = getRGB("a90329");
int[] rgb2 = getRGB("6bba70");
if (percentage < 100) {
int range0 = (rgb1[0] > rgb2[0] ? rgb1[0] : rgb2[0]) - (rgb1[0] < rgb2[0] ? rgb1[0] : rgb2[0]);
int range1 = (rgb1[1] > rgb2[1] ? rgb1[1] : rgb2[1]) - (rgb1[1] < rgb2[1] ? rgb1[1] : rgb2[1]);
int range2 = (rgb1[2] > rgb2[2] ? rgb1[2] : rgb2[2]) - (rgb1[2] < rgb2[2] ? rgb1[2] : rgb2[2]);
int r = (int) (rgb2[0] + Math.round(range0 * percentage / 100));
int g = (int) (rgb2[1] + Math.round(range1 * percentage / 100));
int b = (int) (rgb2[2] + Math.round(range2 * percentage / 100));
System.out.println(Integer.toString(r) + "," + Integer.toString(g) + "," + Integer.toString(b));
colorValue = String.format("#%02x%02x%02x", r, g, b);
} else {
colorValue = "#a90329";
}
return colorValue;
}
public static int[] getRGB(final String rgb) {
final int[] ret = new int[3];
for (int i = 0; i < 3; i++) {
ret[i] = Integer.parseInt(rgb.substring(i * 2, i * 2 + 2), 16);
}
return ret;
}
生产出来的:
远不及我想要的。有人知道如何实现我想要的吗?
【问题讨论】:
-
不回答这个问题,但你可以只减去然后取绝对值,而不是把
range变量搞得一团糟。 -
还有一个名为
Color的类,它有像decode这样的方法,它接受一个十六进制字符串并将其转换为颜色。从那里它有像getRed、getBlue和getGreen这样的方法。 -
CSS 编译器或 javaScript 例程在这里可能会有所帮助 :) codepen.io/gc-nomade/pen/ztDCn(此处使用 scss)
-
javascripted ,包括 IE8 codepen.io/IE-Tests/pen/BIwJm 任何反馈表示感谢。