在Android中检查颜色是暗还是亮

iGi*_*o90 46 android background colors

根据标题,我的问题是:Android是否提供任何方式来分析/确定颜色(显然是动态的)是亮还是暗?

adb*_*oco 92

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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是数字格式的亮度定义.http://en.wikipedia.org/wiki/Luma_%28video%29 (16认同)
  • 你从哪里得到这些神奇的数字?(0.299,0.587,0.114)? (9认同)
  • 看起来像android提供它/sf/answers/3378717121/ (2认同)

Rob*_*yer 54

如果使用支持库v4,则可以使用ColorUtils.calculateLuminance(color),它将颜色的亮度返回为0.0和之间的浮点数1.0.

所以你可以这样做:

boolean isDark(int color) {
    return ColorUtils.calculateLuminance(color) < 0.5;
}
Run Code Online (Sandbox Code Playgroud)

请参阅:https://developer.android.com/reference/android/support/v4/graphics/ColorUtils.html#calculateLuminance(int)

请注意,自Android API 24以来,还有方法:Color.luminance(color).

  • 不知何故,“ColorUtils.calculateLuminance(color) &lt; 0.25”对我来说效果更好。 (2认同)

kro*_*kin 12

如果有人想知道背景颜色是浅色还是深色,以确定在其上面绘制的文本使用什么颜色(白色或黑色)\xe2\x80\x93 计算亮度不会为您提供正确的值所有案件。

\n\n

假设您有背景颜色:#7f6fad。\n如果您检查其亮度(通过ColorUtils#calculateLuminance),您将得到:0.1889803503770053,它位于下面0.5,因此按照该逻辑应被视为黑暗。

\n\n

但如果您遵循WCAG,您会发现一般文本对比度应至少为 4.5:1。

\n\n

ColorUtils 的方法calculateContrast将给出以下结果:

\n\n
    \n
  • 对于白色文本颜色:4.393666669010922
  • \n
  • 对于黑色文本颜色:4.779607007540106
  • \n
\n\n

人们可以看到白色文本提供的对比度不够,而黑色则很好。\n因此,如果您想检查在某种通用背景颜色之上绘制什么颜色,最好检查对比度:

\n\n
@ColorInt\nfun getContrastColor(@ColorInt color: Int): Int {\n    val whiteContrast = ColorUtils.calculateContrast(Color.WHITE, color)\n    val blackContrast = ColorUtils.calculateContrast(Color.BLACK, color)\n\n    return if (whiteContrast > blackContrast) Color.WHITE else Color.BLACK\n}\n
Run Code Online (Sandbox Code Playgroud)\n


Bra*_*ret 5

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];
}
Run Code Online (Sandbox Code Playgroud)

可以轻松地使用ColorUtils检查颜色的亮度。

if (getLightness(color) < 0.5f ){
    // This color is too dark!
}
Run Code Online (Sandbox Code Playgroud)