2015-10-12 15 views
5

Ich habe eine Funktion, die eine bestimmte Farbe nimmt und ich möchte, dass es die Farbe verdunkelt (reduzieren Sie ihre Helligkeit um 20% oder so). Ich kann nicht herausfinden, wie man das nur mit einer Farbe (int) macht. Was ist der richtige Ansatz?Wie verdunkle ich eine bestimmte Farbe (int)

public static int returnDarkerColor(int color){ 
    int darkerColor = .... 
    return darkerColor; 
} 

Antwort

22

Eine Android Art und Weise tun: abzudunkeln

public static int manipulateColor(int color, float factor) { 
     int a = Color.alpha(color); 
     int r = Math.round(Color.red(color) * factor); 
     int g = Math.round(Color.green(color) * factor); 
     int b = Math.round(Color.blue(color) * factor); 
     return Color.argb(a, 
       Math.min(r,255), 
       Math.min(g,255), 
       Math.min(b,255)); 
    } 

Sie wollen einen Faktor als 1.0f weniger verwenden. versuchen Sie 0.8f.

+0

Dies funktioniert einwandfrei. Vielen Dank! – NSouth

3

konvertieren, die Farbe zu einem HSV array, dann die Helligkeit um 20% reduzieren, dann wandeln mit HSVToColor zu RGB zurück HSV-Array. Hinweis: Der Wert, den Sie im Array ändern möchten, lautet V. (d. h. hsv[2])

6

Wenn Sie einfacher und nicht genau wollen, können unten Ihnen helfen.

public static int returnDarkerColor(int color){ 
    float ratio = 1.0f - 0.2f; 
    int a = (color >> 24) & 0xFF; 
    int r = (int) (((color >> 16) & 0xFF) * ratio); 
    int g = (int) (((color >> 8) & 0xFF) * ratio); 
    int b = (int) ((color & 0xFF) * ratio); 

    return (a << 24) | (r << 16) | (g << 8) | b; 
} 
+0

** 1. ** Sie haben Recht. Ich möchte nur Wert 0,2f anzeigen. ** 2, 3. ** Es ist mein Fehler. Ich habe gerade getippt. Danke für die Korrektur. –

+0

Dies funktioniert ordnungsgemäß und ist viel effizienter als die angenommene Antwort – Shyri

+0

Funktioniert gut. Wird verwendet, um meine Titelleiste zu einem dunklen Schatten der Aktionsleiste –

3

Eine einfachere Lösung HSV wie RogueBaneling mit vorgeschlagen:

@ColorInt int darkenColor(@ColorInt int color) { 
    float[] hsv = new float[3]; 
    Color.colorToHSV(color, hsv); 
    hsv[2] *= 0.8f; 
    return Color.HSVToColor(hsv); 
} 

keine komplexen bitweise Operationen oder Math notwendig. Verschieben Sie 0.8f bei Bedarf zu einem Argument.

Verwandte Themen