2015-10-12 13 views
5

Mam funkcję, która przyjmuje określony kolor i chciałbym ją przyciemnić kolor (zmniejszyć jej jasność o 20%). Nie mogę wymyślić, jak to zrobić, biorąc pod uwagę tylko kolor (int). Jakie jest właściwe podejście?Jak przyciemnić dany kolor (int)

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

Odpowiedz

22

Bardziej Android sposób to zrobić:

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

Będziemy chcieli użyć współczynnika mniej niż 1.0f ciemnieć. spróbuj 0.8f.

+0

Działa to bezbłędnie. Dziękuję Ci! – NSouth

3

konwersji koloru do HSV array, a następnie zmniejsza jasność o 20%, a konwersja HSV tablicy z powrotem do RGB HSVToColor. Uwaga: wartością, którą chcesz zmienić w tablicy, będzie wartość-V. (tj. hsv[2])

6

Jeśli chcesz bardziej proste i niedokładne, poniżej może ci pomóc.

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. ** Masz rację. Chcę tylko pokazać wartość 0.2f. ** 2, 3. ** To mój błąd. Właśnie wpisałem. Dziękuję za naprawę. –

+0

Działa to poprawnie i jest znacznie wydajniejsze niż przyjęta odpowiedź. – Shyri

+0

Działa świetnie. Służy do ustawiania paska tytułu w ciemnym odcieniu paska akcji –

3

Prostszym rozwiązaniem przy użyciu HSV jak RogueBaneling zasugerował:

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

żadnych skomplikowanych operacji bitowe lub Math niezbędne. W razie potrzeby przenieś 0.8f na argument.

Powiązane problemy