介绍
Android 开发中,我们很多时候都是通过color.xml管理颜色即可。但是在业务处理过程中。我们也往往会需要针对颜色值进行各种序列化处理。
下面主要介绍如何将#000000
格式的颜色值转成int。并且从里面分别提取R,G,B,A 等值。
下面让我们进入主题吧。
1.res资源中color.xml 中的颜色值获取
主要介绍两种获取方式,一种是我们可以直接得到R元素对象,并获取color。
代码语言:javascript复制int blue = ContextCompat.getColor(this,R.color.actionsheet_blue);
我们得到的将是一个int 值的颜色。
请注意,color的颜色值的rgb拼接顺序并不是所有系统统一的。例如有些系统中针对透明值是放在了#号后面,而有些是放在了字符串末尾。
上面的取值方式有一个前提条件。那么就是color.xml中必须有actionsheet_blue
而如果没有的话就会崩溃了。
那么有没有检测的方法呢?当然有了。下面的例子就是了
代码语言:javascript复制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
。
示例:
代码语言:javascript复制public int color1 = 0xfe042c;
public String color2="#fe042c";
这两个的颜色表达的都是一样的。我们要学会合理的使用。
3. #000000 字符串颜色转换int值
我们经常碰见后台接口传递或者其他数据来源,给与我们的就是#号
开头的一串颜色值。而计算显示的时候我们需要的int值。
那么转换我们可以使用Color自带api实现。示例:
代码语言:javascript复制int zinyanColor = Color.parseColor("#CE042C");
系统使用的也是int值。这也是我建议大家本地如果需要写颜色值的时候,尽量选择int而不是String格式的原因了。
4. color转成 R,G,B,A 十进制值
我们如果需要将color的值转成 R,G,B,A 转成 0~255,范围的整数值,在Android 中可以很简单的实现:
代码语言:javascript复制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 的话。你需要自己进行位移计算了
代码语言:javascript复制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。
代码语言:javascript复制 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转换即可。
了解这几种转换,大家针对颜色的使用就能直观很多了。