今天在看一个Android开源代码的时候看到中间有这么一句:html
mTextView.setBackgroundColor(alpha << 24 | (0xbbffbb)); mTextView.setTextColor(alpha << 24 | (0x000000));
其中mTextView是TextView类的对象,而alpha是一个0到255之间的int值。shell
虽然知道是设置颜色,可是这种写法仍是引发了个人好奇心。ui
怎么又是位移操做又是与运算的。spa
搜索一下,找到一份资料:http://m.oschina.net/blog/104123.net
整理转述得此文。插件
首先,颜色各个份量通常是以每8位为一个单位。code
8位,8bit,即一个字节,10进制数的取值范围是0~255,通常用16进制表示,0x开头,取值范围是0x00到0xFF(不区分大小写)。htm
颜色通常有24位和32位两种表示方法。对象
24位颜色:每8位表示RGB中的一个份量。RGB颜色份量的值越大的时候最终颜色越偏向于这个颜色。blog
32位颜色:除了每8位表示RGB中的一个份量,还有一个8位用于表示透明度,表示为ARGB形式。
A即alpha值,alpha值为0时颜色为透明,alpha值为最大值时颜色为彻底不透明,便可彻底覆盖处于它下面的其余颜色,无其余颜色能够透过它而显示出来。
如图:
表示颜色份量的数要想转化成一个整个的颜色,就必须和其余的份量组合,每一个份量放在本身应当处于的位置,就应该进行位移操做。
固然我开始的时候还小迷惑了一下这个资料中给出的例子:http://m.oschina.net/blog/104123,
若是颜色值都是34,23,88等两位十进制数,而它所说的转换竟然也就是把数字直接放过去了,那0到255的数字,255咋办?三位数呢?
后来想了一下,做者的图是对的,可是文字配的有点问题。
图中的颜色值34,23和88都是十六进制表示的,因此移位操做的时候能够直接移动位置表示。
移位后就是总体移动相应的位数,一个字母表明四位。
R移动16位,G移动8位,B不须要移动。
若是有A值,则A须要向左移动24位。
须要注意的是,无论是用什么进制表示,十进制仍是十六进制仍是二进制,位移操做都是二进制范畴的。
为何说原做者有点小错误呢?
十进制的34,用十六进制表示是0x22。
若是是十进制R34,G23,B88。移位操做后,获得的颜色数值应该是0x221758。
反向的转换则是右移。
知道一个颜色总体值,想提取某一个颜色份量,方法就是向右移动相应的位数,而后作一个与运算,与0xFF作与运算能够提取最低的两位。
这一步参考资料说得很明白:
直接把例子搬过来:
如今咱们知道了rgb的16进制值,那反过来呢?若是咱们知道了一个颜色值,如何反向求解rgb值呢?
var color:uint = 0x342388; var r:uint = color >> 16;//右移16位,把2388移出,取0x34 var g:uint = color >> 8 & 0xff;//右移8位,把88移出,得0x3423,与0xff按位与操做,得0x23 var b:uint = color & 0xff;//获得0x88
咱们再来看看32位的:
var color:uint = 0xff342388; var a:uint = color >>> 24 //注意这里是>>>,无符号右移位操做,右移24位,把342388移出,获得0xff var r:uint = color >> 16 & 0xff;//右移16位,把2388移出,取0x34 var g:uint = color >> 8 & 0xff;//右移8位,把88移出,得0x3423,与0xff按位与操做,得0x23 var b:uint = color & 0xff;//获得0x88
位操做也疯狂:http://m.oschina.net/blog/104123
PS,推荐在线颜色选择器:http://coolshell.cn/articles/3314.html
PPS:FireFox上也有插件(ColorZilla),能够直接从网页上提取颜色,获取其颜色值。