Как затемнить заданный цвет (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 дает нам более темный оттенок цвета от фона кнопки