根据标题,我的问题是:Android是否提供任何方式来分析/确定颜色(显然是动态的)是亮还是暗?
答案 0 :(得分:85)
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's a light color
}else{
return true; // It's a dark color
}
}
答案 1 :(得分:39)
如果您使用支持库v4,则可以使用ColorUtils.calculateLuminance(color)
,它会在0.0
和1.0
之间返回颜色亮度。
所以你可以这样做:
boolean isDark(int color) {
return ColorUtils.calculateLuminance(color) < 0.5;
}
注意,自Android API 24起,还有方法:Color.luminance(color)
。
答案 2 :(得分:5)
$ gcloud.cmd app instances list
SERVICE VERSION ID VM_STATUS DEBUG_MODE
default 20170317t203143 aef-default-20170317t203143-4ctc RUNNING
default 20170317t203143 aef-default-20170317t203143-b4wr RUNNING
default 20170317t203143 aef-default-20170317t203143-tpnt RUNNING
default 20170317t205434 aef-default-20170317t205434-5fm7 RUNNING
default 20170317t205434 aef-default-20170317t205434-6rkt RUNNING
default 20170317t205434 aef-default-20170317t205434-9nkq RUNNING
default 20170317t212530 aef-default-20170317t212530-f869 RUNNING
default 20170317t212530 aef-default-20170317t212530-k6cn RUNNING
default 20170317t212530 aef-default-20170317t212530-lszv RUNNING
default 20170317t213906 aef-default-20170317t213906-5x7c RUNNING
default 20170317t213906 aef-default-20170317t213906-8qg1 RUNNING
default 20170317t213906 aef-default-20170317t213906-qglb RUNNING
default 20170318t002735 aef-default-20170318t002735-b60s RUNNING
default 20170318t002735 aef-default-20170318t002735-hr4c RUNNING
default 20170318t002735 aef-default-20170318t002735-wh80 RUNNING
twoen@DESKTOP-9R5VHUK MINGW64 ~/AppData/Local/Google/Cloud SDK/google-cloud-sdk/bin
$ gcloud.cmd compute backend-services list
Listed 0 items.
可以轻松使用ColorUtils来检查颜色的亮度。
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];
}
答案 3 :(得分:3)
如果要找出背景颜色是浅色还是深色,以确定要在其上绘制的文本使用什么颜色(白色或黑色),那么在所有情况下计算亮度都无法为您提供正确的值
请考虑您使用的背景色:#7f6fad
。
如果您通过ColorUtils#calculateLuminance
检查其亮度,则会得到:0.1889803503770053
,它低于0.5
,因此按照该逻辑应该被认为是暗的。
但是,如果您遵循WCAG,将会看到一般文本的对比度至少应为4.5:1。
ColorUtils具有方法calculateContrast
,它将产生以下结果:
4.393666669010922
4.779607007540106
可以看到,白色文本给出的对比度不够,而黑色则很好。 因此,如果您想检查要在某种通用背景色之上绘制的颜色,则最好检查对比度:
@ColorInt
fun getContrastColor(@ColorInt color: Int): Int {
val whiteContrast = ColorUtils.calculateContrast(Color.WHITE, color)
val blackContrast = ColorUtils.calculateContrast(Color.BLACK, color)
return if (whiteContrast > blackContrast) Color.WHITE else Color.BLACK
}
答案 4 :(得分:0)
另一种解决方案:
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;
}