找出两种颜色之间的对比差异

时间:2017-07-15 12:11:20

标签: java android algorithm

我有一个方法可以将父级的文本和图像色调设置为某种颜色。现在,如果父级和前景的背景(我设置的色调)接近,则文本将无法读取。

如何检查这两种颜色之间的差异并更改一种颜色(使其变浅或变暗)直到它们变得可读?

这是我到现在所拥有的:

public static void invokeContrastSafety(ViewGroup parent, int tint, boolean shouldPreserveForeground) {
    Drawable background = parent.getBackground();
    if (background instanceof ColorDrawable) {
        if (isColorDark(((ColorDrawable) background).getColor())) {
            // Parent background is dark

            if (isColorDark(tint)) {
                // Tint (foreground) color is also dark.
                if (shouldPreserveForeground) {
                    // We can't modify tint color, changing background to make things readable.


                } else {
                    // Altering foreground to make things readable

                }

                invokeInternal(parent, tint);
            } else {
                // Everything is readable. Just pass it on.
                invokeInternal(parent, tint);
            }

        } else {
            // Parent background is light

            if (!isColorDark(tint)) {
                if (shouldPreserveForeground) {

                } else {

                }
            } else {
                invokeInternal(parent, tint);
            }
        }
    }
}

private static boolean isColorDark(int color){
    double darkness = 1-(0.299* Color.red(color) + 0.587*Color.green(color) + 0.114*Color.blue(color))/255;
    return darkness >= 0.2;
}

1 个答案:

答案 0 :(得分:0)

试试这个对我有用的。此函数返回颜色为暗或浅的颜色。

public static boolean isBrightColor(int color) {
    if (android.R.color.transparent == color)
        return true;

    boolean rtnValue = false;

    int[] rgb = { Color.red(color), Color.green(color), Color.blue(color) };

    int brightness = (int) Math.sqrt(rgb[0] * rgb[0] * .241 + rgb[1]
            * rgb[1] * .691 + rgb[2] * rgb[2] * .068);

    // Color is Light
    if (brightness >= 200) {
        rtnValue = true;
    }
    return rtnValue;
}

如果需要,您可以在此功能中更改自定义逻辑。