2013-06-18 50 views
0

下面是一個繪圖工具類,我使用像筆尖一樣。對於繪圖應用程序。排序顏色的整數表示 - android

在我的主要活動中,我有這個對象類型的arrayList,我想按顏色對它們進行排序。

正如你可以看到我有一個compareTo方法,只是返回INT1,INT2(其中int爲每個工具的顏色值..但是,這並不在我預料的方式對它們進行排序。

我想通過像彩虹一樣的顏色對它們進行排序。

現在我知道這可能會更容易,如果他們類型的顏色,而不是int,但是數據源將返回int值一樣0xff000000爲黑色。

public class KNDrawingTool implements Comparable<KNDrawingTool>{ 

    public int id; 
    public String name; 
    public int size; 
    public int color; 
    public int cost; 
    public int capacity; 
    public int amountLeft; 
    public String type; 
    public Paint mPaint; 


    public KNDrawingTool(String toolType, Boolean flatTip, int paintId, String paintName, int paintSize,int paintColor, int paintCost, int canCapacity, int remainingAmount){ 
     type = toolType; 
     id = paintId; 
     name = paintName; 
     size = paintSize; 
     color =paintColor; 
     cost = paintCost; 
     capacity = canCapacity; 
     amountLeft = remainingAmount; 

     mPaint = new Paint(); 

     if(type == "paint"){ 
      mPaint.setMaskFilter(new BlurMaskFilter(15, BlurMaskFilter.Blur.NORMAL)); 
     } 
     /*if(flatTip){ 
      mPaint.setStrokeCap(Paint.Cap.SQUARE); 
     }else{ 
      mPaint.setStrokeCap(Paint.Cap.ROUND); 
     }*/ 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setColor(color); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeWidth(size); 



    } 


    /* (non-Javadoc) 
    * @see java.lang.Comparable#compareTo(java.lang.Object) 
    */ 
    @Override 
    public int compareTo(KNDrawingTool other) { 
     Log.v("TOOL", "SOrting"); 
     return (color-other.color); 
    } 
} 
+0

你怎麼稱呼'compareTo'方法?你使用'compareTo'方法來排序列表嗎?你能提供什麼樣的輸出? –

+0

在我的主要活動中,我有一個ArrayList allTools; 我只是打電話給Collections.sort(allTools); – erik

+0

它排序他們,但我想像DarkRed,中紅色,紅色,DarkPurple,中等紫色,紫色,深藍色等..但我越來越像是暗紅色,深紫色,深藍色,中等紅色,Medium Purple ..等。 – erik

回答

0

你可能會想要轉換你的RGB顏色值到HSL/HSV,然後按每個分量進行排序H = Hue,S =飽和度,(L =亮度| V =值)。我會盡快用代碼更新這篇文章。

代碼更新:

public class MainActivity extends Activity 
{ 
    private static final int[] COLORS = { 
     Color.BLACK, Color.MAGENTA, Color.RED, 
     Color.BLUE, Color.DKGRAY, Color.YELLOW, 
     Color.LTGRAY, Color.GREEN, Color.GRAY, 
     Color.CYAN, Color.WHITE, 0xFFCC0000, 
     0xFF00CC00, 0xFF0000CC, 0xFFCCCC00, 
     0xFF00CCCC, 0xFFCC00CC, 
    }; 

    private static final int[] FOREGROUNDS = { 
     android.R.attr.textColorPrimary, 
     android.R.attr.textColorPrimaryInverse, 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     ListView listView = new ListView(this); 

     ArrayList<KNDrawingTool> tools = new ArrayList<KNDrawingTool>(); 
     for(int i = 0; i < COLORS.length; i++){ 
      tools.add(new KNDrawingTool(COLORS[i], "Color Entry #" + i)); 
     } 
     Collections.sort(tools); 

     final int foregrounds[] = new int[FOREGROUNDS.length]; 
     TypedArray taForegrounds = getTheme().obtainStyledAttributes(FOREGROUNDS); 
     for(int i = 0; i < FOREGROUNDS.length; i++){ 
      foregrounds[i] = taForegrounds.getColor(i, Color.WHITE); 
     } 
     taForegrounds.recycle(); 

     listView.setAdapter(new ArrayAdapter<KNDrawingTool>(this, 0, tools) 
     { 
      @Override 
      public View getView(int position, View convertView, ViewGroup parent) 
      { 
       TextView text; 
       if(convertView == null){ 
        text = (TextView)LayoutInflater.from(parent.getContext()) 
         .inflate(android.R.layout.simple_list_item_1, parent, false); 
       } 
       else{ 
        text = (TextView)convertView; 
       } 
       KNDrawingTool item = getItem(position); 
       text.setText(item.name); 
       text.setBackgroundColor(item.color); 
       if(item.hsv[2] > 0.5){ 
        text.setTextColor(foregrounds[0]); 
       }else{ 
        text.setTextColor(foregrounds[1]); 
       } 
       return text; 
      } 
     }); 
     setContentView(listView); 
    } 


    private class KNDrawingTool implements Comparable<KNDrawingTool> 
    { 
     private int color; 
     private String name; 
     private float[] hsv = new float[3]; 

     public KNDrawingTool(int color, String name) 
     { 
      this.color = color; 
      this.name = name; 
      Color.colorToHSV(color, hsv); 
     } 

     @Override 
     public int compareTo(KNDrawingTool another) 
     { 
      for(int i = 0; i < 3; i++){ 
       if(hsv[i] != another.hsv[i]){ 
        return (hsv[i] < another.hsv[i]) ? -1 : 1; 
       } 
      } 
      return 0; 
     } 
    } 
}