我在项目中使用了大约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));
}
我想您将需要两件事:颜色列表(例如List<Color> colors
)和根据颜色的深浅比较颜色的某种方式。(请参阅:评估十六进制值是深色还是浅色)。
例如,如果我们仅比较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);
}
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句