Android Color 判断色值小结

简介:       小菜我最近在处理主题色方面的问题,有个小需求是处理更改颜色,判断色值等,稍稍整理了一下。      Color 大家都很熟悉,其组成方式是 RGB 红绿蓝三原色,小菜觉得可以按 ARGB 即 Alpha 透明度、Red 红色、Green 绿 和 Blue 蓝色来记。

      小菜我最近在处理主题色方面的问题,有个小需求是处理更改颜色,判断色值等,稍稍整理了一下。
      Color 大家都很熟悉,其组成方式是 RGB 红绿蓝三原色,小菜觉得可以按 ARGB 即 Alpha 透明度、Red 红色、Green 绿 和 Blue 蓝色来记。默认的 Alpha 为 FF/255 完全不透明,可不设置;若 Alpha 为 00/0 时,代表完全透明,则红绿蓝不起作用;而介于 00-FF/0-255 之间时,可以显示出颜色不同的层次效果。


小菜的测试步骤如下:

  1. 在 color.xml 中定义几个测试颜色值;
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="test_color1">#3F51B5</color>
    <color name="test_color2">#3F51B5</color>
    <color name="test_color3">#FF4081</color>
    <color name="test_color4">#40FF4081</color>
</resources>
  1. 小菜想是否可以直接用 R.color.XX 方式判断色值,测试不相同,小菜理解获取的是 R 的值;
// 日志输出
Log.e("color1==" + R.color.test_color1, "color2==" + R.color.test_color2);
// 结果
color1==2131427410: color2==2131427411
  1. 小菜测试用 getResources().getColor(R.color.XX) 方式,结果是对的;
// 日志输出
Log.e("test_color1==" + getResources().getColor(R.color.test_color1), "test_color2==" + getResources().getColor(R.color.test_color2));
// 结果
test_color1==-12627531: test_color2==-12627531
  1. 继续测试,获取某个控件背景色;
// 日志输出
if (mColorTv1.getBackground() instanceof ColorDrawable) {
    ColorDrawable colordDrawable = (ColorDrawable) mColorTv1.getBackground();
    int color = colordDrawable.getColor();
     Log.e("color1==" + color, "test_color3==" + getResources().getColor(R.color.test_color3));
}
// 结果
color==-49023: test_color3==-49023
  1. 获取方式都是可以的,只是这种方式看起来并不直接,转成 16 进制看起来会更自然;
String Color_16(int color) {
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append("#");
    stringBuffer.append(Integer.toHexString(Color.alpha(color)));
    stringBuffer.append(Integer.toHexString(Color.red(color)));
    stringBuffer.append(Integer.toHexString(Color.green(color)));
    stringBuffer.append(Integer.toHexString(Color.blue(color)));
    return stringBuffer.toString();
}

String Color_16_NoAlpha(int color) {
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append("#");
    stringBuffer.append(Integer.toHexString(Color.red(color)));
    stringBuffer.append(Integer.toHexString(Color.green(color)));
    stringBuffer.append(Integer.toHexString(Color.blue(color)));
    return stringBuffer.toString();
}
// 日志输出
if (mColorTv1.getBackground() instanceof ColorDrawable) {
    ColorDrawable colordDrawable = (ColorDrawable) mColorTv1.getBackground();
    int color = colordDrawable.getColor();
     Log.e("color==" + Color_16(color), "test_color3==" + Color_16(getResources().getColor(R.color.test_color3)));
}
// 结果
color==#FF4081: test_color3==#FF4081
测试结果

以下是测试完整代码:

public class ColorActivity extends AppCompatActivity {

    Toolbar mToolbar;
    TextView mTitleTv, mColorTv1, mColorTv6;
    StringBuffer strBuffer = new StringBuffer();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_color);

        mToolbar = (Toolbar) this.findViewById(R.id.toolbar);
        mTitleTv = (TextView) this.findViewById(R.id.tv_toolbar_title);
        mTitleTv.setText("Color 色值判断");
        mColorTv1 = (TextView) this.findViewById(R.id.color_tv1);
        mColorTv6 = (TextView) this.findViewById(R.id.color_tv6);

        strBuffer.append("R.color.test_color1 方式  " + R.color.test_color1 + "\n" + "R.color.test_color2 方式  " + R.color.test_color2 + "\n");
        strBuffer.append("getResources().getColor(R.color.test_color1) 方式  " + getResources().getColor(R.color.test_color1) + "\n" + "getResources().getColor(R.color.test_color2) 方式  " + getResources().getColor(R.color.test_color2) + "\n" + "getResources().getColor(R.color.test_color3) 方式  " + getResources().getColor(R.color.test_color3) + "\n");
      
        if (mToolbar.getBackground() instanceof ColorDrawable) {
            ColorDrawable colordDrawable = (ColorDrawable) mToolbar.getBackground();
            int color = colordDrawable.getColor();

            Log.e("=======color1==" + color, "=======color2==" + getResources().getColor(R.color.test_color3));
        }

        if (mColorTv1.getBackground() instanceof ColorDrawable) {
            ColorDrawable colordDrawable = (ColorDrawable) mColorTv1.getBackground();
            int color = colordDrawable.getColor();
            strBuffer.append("ColorTv  " + color + "\n");
            strBuffer.append("ColorTv 十六进制  " + Color_16(color) + "\n");
            strBuffer.append("ColorTv 十六进制(无透明度)  " + Color_16_NoAlpha(color) + "\n");
            strBuffer.append("ColorTv 透明度 " + Color_Alpha(color) + " 红 " + Color_Red(color) + " 绿 " + Color_Green(color) + " 蓝 " + Color_Blue(color) + "\n");
        }
        strBuffer.append("R.color.test_color3 十六进制  " + Color_16(getResources().getColor(R.color.test_color3)) + "\n");
        strBuffer.append("R.color.test_color3 十六进制(无透明度)  " + Color_16_NoAlpha(getResources().getColor(R.color.test_color3)) + "\n");
        strBuffer.append("R.color.test_color3 透明度 " + Color_Alpha(getResources().getColor(R.color.test_color3)) + " 红 " + Color_Red(getResources().getColor(R.color.test_color3)) + " 绿 " + Color_Green(getResources().getColor(R.color.test_color3)) + " 蓝 " + Color_Blue(getResources().getColor(R.color.test_color3)) + "\n");
        strBuffer.append("R.color.test_color4 十六进制  " + Color_16(getResources().getColor(R.color.test_color4)) + "\n");
        strBuffer.append("R.color.test_color4 十六进制(无透明度)  " + Color_16_NoAlpha(getResources().getColor(R.color.test_color4)) + "\n");
        strBuffer.append("R.color.test_color4 透明度 " + Color_Alpha(getResources().getColor(R.color.test_color4)) + " 红 " + Color_Red(getResources().getColor(R.color.test_color4)) + " 绿 " + Color_Green(getResources().getColor(R.color.test_color4)) + " 蓝 " + Color_Blue(getResources().getColor(R.color.test_color4)) + "\n");
        mColorTv6.setText(strBuffer.toString());

    }

    String Color_16(int color) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("#");
        stringBuffer.append(Integer.toHexString(Color.alpha(color)));
        stringBuffer.append(Integer.toHexString(Color.red(color)));
        stringBuffer.append(Integer.toHexString(Color.green(color)));
        stringBuffer.append(Integer.toHexString(Color.blue(color)));
        return stringBuffer.toString();
    }

    String Color_16_NoAlpha(int color) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("#");
        stringBuffer.append(Integer.toHexString(Color.red(color)));
        stringBuffer.append(Integer.toHexString(Color.green(color)));
        stringBuffer.append(Integer.toHexString(Color.blue(color)));
        return stringBuffer.toString();
    }

    String Color_Alpha(int color) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(Integer.toHexString(Color.alpha(color)));
        return stringBuffer.toString();
    }

    String Color_Red(int color) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(Integer.toHexString(Color.red(color)));
        return stringBuffer.toString();
    }

    String Color_Green(int color) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(Integer.toHexString(Color.green(color)));
        return stringBuffer.toString();
    }

    String Color_Blue(int color) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(Integer.toHexString(Color.blue(color)));
        return stringBuffer.toString();
    }

    public static int Color_ChangeAlpha(int color, int alpha) {
        int red = Color.red(color);
        int green = Color.green(color);
        int blue = Color.blue(color);

        return Color.argb(alpha, red, green, blue);
    }
}

      Tips:获取控件背景色时要注意 backdround 是 color 还是 drawable,可先判断是否是 ColorDrawable。


      下面的是小菜的公众号,欢迎闲来吐槽哦~

小菜公众号
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
安全 Java Android开发
【Android 逆向】APK 加壳脱壳现状 | 判断 APK 是否加壳 | APK 逆向流程
【Android 逆向】APK 加壳脱壳现状 | 判断 APK 是否加壳 | APK 逆向流程
1120 0
|
存储 XML 设计模式
一个简单的Android网络访问全局码判断及通用数据解析方案
我们在开发中,网络请求经常会遇到各种错误码的判断。比如下面这样:
119 0
|
传感器 安全 开发工具
Android识别模拟器,判断是模拟器还是真机
Android识别模拟器,判断是模拟器还是真机
1813 0
|
Android开发
Android日期选择器,年月日判断处理。
Android日期选择器,年月日判断处理。
266 0
Android日期选择器,年月日判断处理。
|
XML Java Android开发
如何判断当前屏幕TextView是否会自动换行_Android提高篇(Java)
如何判断当前屏幕TextView是否会自动换行_Android提高篇(Java)
400 0
|
JSON Android开发 图形学
修行Android Studio技巧到出神入化,快速涨薪-【预览列表】、【Null判断】篇
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
149 0
|
Android开发 数据库管理
android sqlite 判断表和表中字段是否存在方法
android sqlite 判断表和表中字段是否存在方法
|
Android开发
android 网络实时监听网络状态变化 及 网络类型判断
android 网络实时监听网络状态变化 及 网络类型判断
|
传感器 Android开发 开发者
Android笔记:判断是否为模拟器(实测夜神通过)
Android笔记:判断是否为模拟器(实测夜神通过)
1461 0
|
Android开发
Android笔记:判断某个字符串里某个字符串的个数
Android笔记:判断某个字符串里某个字符串的个数
372 0