技术分享 Technology to share

编程界里面的颜色“0x”and“#”

从24位来说,计算机中每一个颜色matrix用3个无符号整数表示,在颜色这3个字节中,大家规定

17-24位表示红色的分量

9-16位表示绿色的分量

1-8位表示蓝色的分量

因此一个十进制数表示的颜色很难直观被观视,而16进制数可以很方便查看出当前大概颜色。



0x是计算机表示16进制数的规定写法,其实就是颜色在内存(显存)中的存储方式

# 也是16进制表示,但是其一般是设计领域或者css中的表示方法(通常用在文本标记语言中),其需经过转译或者说经过解析,与json解析同理。

简单理解,int类型转为16进制返回值肯定是String,因为16进制有 A—E表示数值所以只能用String表示,不然 java代码中你用long temp="abc";int temp="bcd",这种是肯定报错,但是我怎么知道你这个String表示的是颜色,所以就加了标记#,但是我想在类似于java这样的语言代码中直接定义一个16进制的东西,方便我写与观看,于是用0x这个标记就没问题,早期约定俗成的东西。

android一般是8位记色,譬如#80FFFFFF(0x表示为0x80FFFFFF但我遇到并非所有颜色都适合0x替换#,有时候替换也无卵用,目前没清楚为啥) 前两位表示透明度,有的0x如果是8位它会被java语言认定为long类型,但是经常在一些方法参数中颜色类型需要的是int所以务必要小心,譬如百度地图的画圆圈方法参数



颜色补码转换

有时候我们通过代码获取的颜色为-16777216,这种带符号的负数(经探究为String数值转为10进制,下有系统解析源码),这是颜色的补码,可以用如下代码转换为我们通常熟悉的颜色代码:

int alpha = Color.alpha(color);
int red = Color.red(color);
int green = Color.green(color);
int blue = Color.blue(color);


“#”截取部分Android颜色转换源码片段欣赏一下

如下代码非常简单,去除"#"字符将剩余部分通过Long类转成16进制long数值,之后设置alpha值返回,字符串转换解析其实是交给的Long封装类解决,就是传统的16进制转为10进制操作,没啥特殊: