今天在看一個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),能夠直接從網頁上提取顏色,獲取其顏色值。