web-dev-qa-db-fra.com

Comment assombrir une couleur donnée (int)

J'ai une fonction qui prend une couleur donnée et je voudrais qu'elle assombrisse la couleur (réduisez sa luminosité d'environ 20%). Je ne peux pas comprendre comment le faire étant donné juste une couleur (int). Quelle est la bonne approche?

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

Une façon plus Android de le faire:

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

Vous souhaiterez utiliser un facteur inférieur à 1.0f pour foncer. essayez 0.8f.

52
Gary McGowan

Il y a même une solution plus simple qui n'a pas été mentionnée auparavant, Android a une classe appelée ColorUtils qui peut vous aider avec cela, voici un extrait Kotlin d'une fonction d'extension

inline val @receiver:ColorInt Int.darken
    @ColorInt
    get() = ColorUtils.blendARGB(this, Color.BLACK, 0.2f)

la méthode ColorUtils.blendARGB prend votre couleur comme premier paramètre et la deuxième couleur que vous souhaitez mélanger, black dans ce cas et enfin, le dernier paramètre est le rapport entre votre couleur et la couleur noire que vous mélangez.

28
Leosan

Une solution plus simple utilisant HSV comme RogueBaneling a suggéré:

Kotlin

@ColorInt fun darkenColor(@ColorInt color: Int): Int {
    return Color.HSVToColor(FloatArray(3).apply {
        Color.colorToHSV(color, this)
        this[2] *= 0.8f
    })
}

Java

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

Aucune opération complexe au niveau du bit ou Math nécessaire. Bouge toi 0.8f à un argument si nécessaire.

16
Nohus

Si vous voulez plus de simplicité et de précision, ce qui suit peut vous aider.

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;
}
11
Wayne Jo

Convertissez la couleur en tableau HSV , puis réduisez la luminosité de 20%, puis reconvertissez le tableau HSV en RVB avec HSVToColor. Remarque: La valeur que vous cherchez à modifier dans le tableau sera la valeur V-. (c'est à dire., hsv[2])

4
RogueBaneling

De cette façon, vous pouvez sélectionner le pourcentage de couleur et ainsi obtenir une teinte plus foncée ou une teinte plus claire

`    int color = ((ColorDrawable)c2.getBackground()).getColor();
            int  colorLighter=-color*40/100+color;
            int  colorDarker=+color*40/100+color;    `

colorlighter nous donne une nuance de couleur plus claire de l'arrière-plan du bouton colordarker nous donne une nuance de couleur plus foncée de l'arrière-plan du bouton

0
Anamika Singh