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