Android 判断颜色为深颜色还是浅颜色来动态调整app文字和图标颜色

Android 判断颜色为深颜色还是浅颜色来动态调整app文字和图标颜色

  • 前言
  • 解决
    • 方案1
    • 方案2
  • 完事

前言

现在,项目中有个需求就是 app 的顶部 title bar 的颜色能根据背景图片动态调整颜色。但是这时候就会有一个问题,那就是 title bar 上面会有一些图标和文字,他们应该变成什么颜色才对呢?
我们可以参考系统状态栏,显示两种颜色,黑色和白色。当背景颜色为深色系的颜色时,就显示白色;当背景颜色为浅色系时,就显示黑色。
但是怎么区分背景颜色是深色系还是浅色系呢?

解决

参考:@tomcatsg – 如何通过RGB值判断颜色深浅

方案1

把 RGB 的值求和,然后取一个值,当和大于等于此值就为浅色。
公式如下:

if ($R + $G + $B >= 450) {
    // add shadow
}

这个算法很傻很简单,但效果不理想,特别是在 B 较大的时候,估计是眼睛对 RGB 各种颜色的敏感度都不一样。

方案2

把 RGB 模式转换成 YUV 模式,而 Y 是明亮度(灰阶),因此只需要获得 Y 的值而判断他是否足够亮就可以了。
公式如下:

$grayLevel = $R * 0.299 + $G * 0.587 + $B * 0.114;
if ($grayLevel >= 192) {
    // add shadow
}

代码中使用:

    /**
     * 显示标题背景颜色
     * @param colorInt
     */
    public void setTittleColor(int colorInt) {
        llTittle.setBackgroundColor(colorInt);
        int gray = (int) (Color.red(colorInt) * 0.299 + Color.green(colorInt) * 0.587 + Color.blue(colorInt) * 0.114);
        int color;
        if (gray >= 192) {
            // 深色系
            color = mContext.getResources().getColor(R.color.text_normal_color);
        } else {
            // 浅色系
            color = mContext.getResources().getColor(R.color.white_color);
        }
        imgBack.setColorFilter(color);
        imgLast.setColorFilter(color);
        imgNext.setColorFilter(color);
        imgRefresh.setColorFilter(color);
        txtTittle.setTextColor(color);
    }

完事

你可能感兴趣的:(Android知识点)