2014-09-05 167 views
2

大约30-40种不同颜色用于我的项目。我将这些颜色的十六进制代码保存在一个数组中,并在列表视图中显示它们。目前的列表查看颜色是随机列出的。如何在Java中将颜色代码从浅到深排序

但是,我想根据它们从白色到黑色的接近度对这些颜色进行排序。

当前随机列表视图链接:

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

现在什么是exect问题?你卡在哪里?从什么时候开始,RGB代码是由8个十六进制数字组成的? – kai 2014-09-05 06:54:16

+0

所以如果你有一个代码列表,你想要他们排序,是吗?例如,如果您有000000,999999,FFFFFF,333333 ..,您希望它们在[FFFFFF,999999,333333,000000]的顺序列表中? – coffeeaddict 2014-09-05 07:00:22

+0

是的,我已经有列表颜色代码,我如何将它们排序000000到ffffff? f = 15对不对?它会工作,如果我分类00 00 00 00 00 00到151515151515? – 2014-09-05 07:06:51

回答

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); 
     } 
    }); 
0

正如你可能知道,在格式#xxxxxx颜色都组织了红色的 “量” acording(前两个十六进制),绿色(中间两个十六进制)和蓝色(最后两个十六进制)。

所以,如果白#ffffff和黑色#000000,然后尝试通过平均这三个数字的排序颜色(由3的值相加为红色,格伦和蓝色和除)

+0

为什么要除以3?它不会改变排序顺序。 – 2014-09-05 08:14:50

+0

@DavidWallace因为它会是R G和B的平均值 – morgano 2014-09-05 10:24:43

1

这可能是最简单的方法,但不一定是最准确的。为了更准确的方法,请参阅我的其他答案。

将它们转换为HSV并对V进行排序 - 这是对颜色亮度的度量。请注意,使用HSV的Java方法将其称为HSB,只是为了有所不同。

可能最简单的做法是编写一个Comparator,它调用Color类的RGBtoHSB方法,并对每个结果中的第三个数字进行比较。

1

来自HSL和HSV上的维基百科页面

更感知相关的替代方法是使用亮度Y'作为明度维度(图3)。 12D)。亮度是伽玛校正的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并对此进行比较。

+0

你好,我尝试着你的。但我怎样才能将我的int颜色代码值转换为RGB代码?我的代码喜欢它,int color; Field [] fields = R.color.class.getDeclaredFields(); color = fields [i] .getInt(null); – 2014-09-05 08:09:19

+0

使用'new Color(yourIntegerGoesHere)'创建一个'Color'对象,然后调用'getRed()','getGreen()'和'getBlue()'。 – 2014-09-05 08:13:31