в соответствии с заголовком, мой вопрос: поддерживает ли Android какой-либо способ анализа/определения того, является ли цвет (который будет явно динамическим для этой цели) светлым или темным?
Убедитесь, что цвет темный или светлый в Android
Ответ 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;
}
Увидеть:
- Библиотека поддержки v4: https://developer.android.com/reference/android/support/v4/graphics/ColorUtils.html#calculateLuminance(int)
- AndroidX: https://developer.android.com/reference/androidx/core/graphics/ColorUtils#calculateLuminance(int)
Обратите внимание, с 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;
}