我在项目中使用了大约30-40种不同的颜色。我在一个阵列上持有这些颜色的十六进制代码并在listview上显示它们。当前列表视图颜色随机列出。
但是我想根据它们从白色到黑色的接近程度对这些颜色进行排序。
当前随机listview链接:
http://tinypic.com/view.php?pic=33ufll3&s=8#.VAiClfmSyXY
我的代码:
public void work(String sub){
ArrayList<String> colorCodes = new ArrayList<String>();
ArrayList<String> colorNames = new ArrayList<String>();
ArrayList<Integer> colors = new ArrayList<Integer>();
Field [] fields = R.color.class.getDeclaredFields();
String colorCode;
String colorName;
int color;
final CustomList adapter2 = new CustomList(MainActivity.this,
add.colorArray);
adapter2.clear();
int number=0;
try
{
for(int i=0; i<fields.length; i++)
{
getResources().getColor(fields[i].getInt(null));
colorName = fields[i].getName();
colorCode = getResources().getString(fields[i].getInt(null));
color = fields[i].getInt(null);
System.out.println("COLOR:" +String.valueOf(color));
if(fields[i].getName().subSequence(0, 3).equals(sub)){
if(!colorCodes.contains(colorCode))
{
colorCodes.add(colorCode);
colorNames.add(colorName);
colors.add(color);
}
}
}
}
catch (Exception ex){}
number=0;
for(int i=0;i<colorCodes.size();i++){
add.adding(colorCodes.get(i), number+1,colors.get(i));
number++;
}
add.doCustom(adapter2, (ListView) findViewById(R.id.listView1));
}
答案 0 :(得分:2)
我想你需要两件事:颜色列表(例如List<Color> colors
)以及根据它们的暗度或亮度来比较颜色的某种方式。 (见:Evaluate whether a HEX value is dark or light)。
例如,如果我们只是比较RGB值的总和(这可能不足以满足您的目的),那么比较顺序将由...建立。
@Override
public int compare(Color c1, Color c2) {
return Integer.compare(c1.getRed() + c1.getGreen() + c1.getBlue(), c2.getRed() + c2.getGreen() + c2.getBlue());
}
然后实际的排序就是:
Collections.sort(colors, new Comparator<Color>() {
@Override
public int compare(Color c1, Color c2) {
return Integer.compare(c1.getRed() + c1.getGreen() + c1.getBlue(), c2.getRed() + c2.getGreen() + c2.getBlue());
}
});
这是基于发光的实现:
Collections.sort(colors, new Comparator<Color>() {
@Override
public int compare(Color c1, Color c2) {
return Float.compare(((float) c1.getRed() * 0.299f + (float) c1.getGreen() * 0.587f
+ (float) c1.getBlue() * 0.114f) / 256f, ((float) c2.getRed() * 0.299f + (float) c2.getGreen()
* 0.587f + (float) c2.getBlue() * 0.114f) / 256f);
}
});
答案 1 :(得分:1)
这可能是最简单的方法,但不一定是最准确的方法。有关更准确的方法,请参阅我的其他答案。
将它们转换为HSV并在V上排序 - 这是衡量颜色亮度的指标。请注意,使用HSV的Java方法称之为HSB,只是为了区别。
可能最简单的方法是编写一个Comparator
来调用RGBtoHSB
类的Color
方法,并对每个结果中的第三个数字进行比较。
答案 2 :(得分:1)
来自HSL和HSV的维基百科页面
更具感知意义的替代方案是使用亮度,Y'作为亮度维度(图12d)。 Luma是伽马校正的R,G和B的加权平均值,基于它们对感知亮度的贡献,长期用作彩色电视广播中的单色维度。对于Rec。在sRGB中使用的709个原色,Y'709 = 0.21R + 0.72G + 0.07B;对于Rec。 601 NTSC原色,Y'601 = 0.30R + 0.59G + 0.11B;对于其他原色,应使用不同的系数。
因此,如果准确性很重要,我建议您编写一个计算0.21 * R + 0.72 * G + 0.07 * B
的比较器并对其进行比较。
答案 3 :(得分:0)
正如您可能知道的那样,#xxxxxx
格式的颜色按照红色(前两个十六进制),绿色(中间两个十六进制)和蓝色(最后两个十六进制)的“数量”进行组织。
因此,如果白色为#ffffff
而黑色为#000000
,则尝试按这三个数字的平均值对颜色进行排序(将红色,蓝色和蓝色的值相加并除以3)