颜色表示和位操做

 

颜色表示和位操做

 

  今天在看一个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开头,取值范围是0x000xFF(不区分大小写)。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),能够直接从网页上提取颜色,获取其颜色值。

相关文章
相关标签/搜索