Как затемнить заданный цвет (int)
У меня есть функция, которая принимает заданный цвет, и я хотел бы, чтобы он затемнил цвет (уменьшите его яркость на 20% или около того). Я не могу понять, как это сделать, учитывая только цвет (int). Каков правильный подход?
public static int returnDarkerColor(int color){
int darkerColor = ....
return darkerColor;
}
Ответы
Ответ 1
Больше возможностей для Android:
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));
}
Вы хотите использовать коэффициент меньше 1.0f
, чтобы затемнить. попробуйте 0.8f
.
Ответ 2
Существует даже более простое решение, которое не было упомянуто ранее. В Android есть класс ColorUtils
который поможет вам в этом: фрагмент ColorUtils
Kotlin для функции расширения.
inline val @receiver:ColorInt Int.darken
@ColorInt
get() = ColorUtils.blendARGB(this, Color.BLACK, 0.2f)
метод ColorUtils.blendARGB
принимает ваш цвет в качестве первого параметра и второго цвета, который вы хотите смешать, в данном случае black
и, наконец, последний параметр - это соотношение между вашим цветом и смешиваемым черным цветом.
Ответ 3
Если вы хотите более просто и не точно, ниже может помочь вам.
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;
}
Ответ 4
Более простое решение с использованием HSV, такое как RogueBaneling, предлагает:
Котлин
@ColorInt fun darkenColor(@ColorInt color: Int): Int {
return Color.HSVToColor(FloatArray(3).apply {
Color.colorToHSV(color, this)
this[2] *= 0.8f
})
}
Джава
@ColorInt int darkenColor(@ColorInt int color) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] *= 0.8f;
return Color.HSVToColor(hsv);
}
Никаких сложных побитовых операций или Math
операций не требуется. Переместите 0.8f
к аргументу, если это необходимо.
Ответ 5
Преобразуйте цвет в массив HSV, затем уменьшите яркость на 20%, затем преобразуйте массив HSV обратно в RGB с помощью HSVToColor
. Примечание. Значение, которое вы хотите изменить в массиве, будет V
-value. (т.е. hsv[2]
)
Ответ 6
Таким образом, вы можете выбрать процент цвета и, таким образом, получить оттенок темнее или светлее
' int color = ((ColorDrawable)c2.getBackground()).getColor();
//цвет фона кнопки (c2) int colorLighter = -color * 40/100 +color; int colorDarker = +color * 40/100 +color; 'colorlighter дает нам более светлый оттенок цвета от фона кнопки Colordarker дает нам более темный оттенок цвета от фона кнопки