侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 290 篇文章
  • 累计创建 57 个标签
  • 累计收到 98 条评论

Android Color颜色值的转换,字符串转int。获取RGBA值-了解Color的几种转换和取值

Z同学
2021-12-28 / 0 评论 / 4 点赞 / 1,894 阅读 / 2,598 字
温馨提示:
本文最后更新于 2021-12-28,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

Android 开发中,我们很多时候都是通过color.xml管理颜色即可。但是在业务处理过程中。我们也往往会需要针对颜色值进行各种序列化处理。

下面主要介绍如何将#000000格式的颜色值转成int。并且从里面分别提取R,G,B,A 等值。

image-20211228104550768

下面让我们进入主题吧。

1.res资源中color.xml 中的颜色值获取

主要介绍两种获取方式,一种是我们可以直接得到R元素对象,并获取color。

int blue = ContextCompat.getColor(this,R.color.actionsheet_blue);

我们得到的将是一个int 值的颜色。

请注意,color的颜色值的rgb拼接顺序并不是所有系统统一的。例如有些系统中针对透明值是放在了#号后面,而有些是放在了字符串末尾。

上面的取值方式有一个前提条件。那么就是color.xml中必须有actionsheet_blue而如果没有的话就会崩溃了。

那么有没有检测的方法呢?当然有了。下面的例子就是了

int blue =getResources().getIdentifier("actionsheet_blue", "color", context.getPackageName());

我们通过id 字段值去检测是否有color类型的该属性值。有的话blue就是有值,而如果没有的话blue=0

这种方案可以避免掉color.xml没有颜色值定义时出现的崩溃现象。

(第二种方法,更多的使用在SDK开发上)

2.在java代码中定义color值

经常见到在代码中定义color的情况: String color1= "#CE042C"。这种写法也可以,就是使用的过程中还会面临颜色转换的逻辑,效率太低。而且String 相较于int 占用的内存空间明显要大。

所以,建议在定义color的时候,直接写成:int color1 =0xCE042C

示例:

public int color1 = 0xfe042c;
public String color2="#fe042c";

这两个的颜色表达的都是一样的。我们要学会合理的使用。

3. #000000 字符串颜色转换int值

我们经常碰见后台接口传递或者其他数据来源,给与我们的就是#号开头的一串颜色值。而计算显示的时候我们需要的int值。

那么转换我们可以使用Color自带api实现。示例:

int zinyanColor = Color.parseColor("#CE042C");

系统使用的也是int值。这也是我建议大家本地如果需要写颜色值的时候,尽量选择int而不是String格式的原因了。

4. color转成 R,G,B,A 十进制值

我们如果需要将color的值转成 R,G,B,A 转成 0~255,范围的整数值,在Android 中可以很简单的实现:

int zinyanColor=0xCE042C;
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(Color.alpha(zinyanColor) + ",");
stringBuffer.append(Color.red(zinyanColor) + ",");
stringBuffer.append(Color.green(zinyanColor) + ",");
stringBuffer.append(Color.blue(zinyanColor) + ",");
Log.e("XXXXXXXX", stringBuffer.toString());
//输出结果是
0,206,4,44,

上面的示例就是直接提前颜色值的0-255范围结果了。

如果你的Color版本太低了。没有上面的api 的话。你需要自己进行位移计算了

int zinyanColor=0xCE042C;
int r = ((zinyanColor >> 16) & 0xff);
int g = ((zinyanColor >> 8) & 0xff);
int b = ((zinyanColor) & 0xff);
int a = ((zinyanColor >> 24) & 0xff);
//输出结果是
0,206,4,44,

上面的位移计算 16,8,24等。是怎么来的呢?

那是因为:0xce042c 的组合顺序是:ARGB 格式。也就是说2c代表了B,04代表了G,ce点了R,而我们这个颜色值没有A的值。如果有的话那就是0xFFce042c 。ff就是A了。

然后每个颜色范围8位。从右往左获取并计算。

也就是B 从0到7,G从8-15,R从16到23,然后A就是24之后了。

由于Android的颜色值顺序是:ARGB。所以上面的例子是这样进行位移的。但是还设有RGBA等情况。那么就要灵活调整位移了。明白原理和过程后,我们也可以自己随意进行调整

5. 获取Color 的R,G,B,A 十六进制值

我们在上面学习了String Color 转int Color。 那么我们这一次就学习如何将int Color 转String Color。

	int zinyanColor=0xCE042C;
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("#");
        stringBuffer.append(Integer.toHexString(Color.red(zinyanColor)));
        stringBuffer.append(Integer.toHexString(Color.green(zinyanColor)));
        stringBuffer.append(Integer.toHexString(Color.blue(zinyanColor)));
        Log.e("XXXXXXXX",stringBuffer.toString());
//输出结果是
##ce42c

这种的转换比较简单。但是默认转换为int整数了,我们如果要转成16进制也就是Hex转换即可。

了解这几种转换,大家针对颜色的使用就能直观很多了。

4

评论区