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

时间:2014-06-17 09:58:09

标签: android colors background

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

5 个答案:

答案 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.01.0之间返回颜色亮度。

所以你可以这样做:

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

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

注意,自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;
}