Подтвердить что ты не робот

Убедитесь, что цвет темный или светлый в Android

в соответствии с заголовком, мой вопрос: поддерживает ли Android какой-либо способ анализа/определения того, является ли цвет (который будет явно динамическим для этой цели) светлым или темным?

4b9b3361

Ответ 1

Android не предоставляет его, вы можете реализовать метод для его определения. Вот способ сделать это:

public boolean isColorDark(int color){
    double darkness = 1-(0.299*Color.red(color) + 0.587*Color.green(color) + 0.114*Color.blue(color))/255;
    if(darkness<0.5){
        return false; // It a light color
    }else{
        return true; // It a dark color
    }
}

Ответ 2

Если вы используете библиотеку поддержки v4 (или AndroidX), вы можете использовать ColorUtils.calculateLuminance(color), который возвращает яркость цвета в виде числа с плавающей точкой от 0.0 до 1.0.

Таким образом, вы можете сделать что-то вроде:

boolean isDark(int color) {
    return ColorUtils.calculateLuminance(color) < 0.5;
}

Увидеть:

Обратите внимание, с Android API 24 есть также метод: Color.luminance(color).

Ответ 3

public float getLightness(int color) {
    int red   = Color.red(color);
    int green = Color.green(color);
    int blue  = Color.blue(color);

    float hsl[] = new float[3];
    ColorUtils.RGBToHSL(red, green, blue, hsl);
    return hsl[2];
}

Можно легко использовать ColorUtils для проверки легкости цвета.

if (getLightness(color) < 0.5f ){
    // This color is too dark!
}

Ответ 4

Другое решение:

private static final int BRIGHTNESS_THRESHOLD = 130;

/**
 * Calculate whether a color is light or dark, based on a commonly known
 * brightness formula.
 *
 * @see {@literal http://en.wikipedia.org/wiki/HSV_color_space%23Lightness}
 */
public static boolean isColorDark(int color) {
    return ((30 * Color.red(color) +
            59 * Color.green(color) +
            11 * Color.blue(color)) / 100) <= BRIGHTNESS_THRESHOLD;
}