在in或者快手App中你可以發現當圖片未加載出來時顯示的是圖片的主題色,這是怎麼做到的呢?下面就介紹利用Paltte實現這種效果(你可以在上傳時就獲取圖片的主題色):
獲取Palette的v4/v7支持包:http://pan.baidu.com/s/1hqvs2xQ http://pan.baidu.com/s/1i3Clwln
獲取主題色屬於耗時操作,Palette已經提供支持異步獲取主題色
public void setPixelsColor(int resourceId){
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId);
Palette.generateAsync(bitmap, new PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
// TODO Auto-generated method stub
int rgb = palette.getLightMutedSwatch().getRgb();//獲取主題色
ll_main.setBackgroundColor(rgb);//爲LinearLayout添加背景色
}
});
}
利用Palette獲取主題色時有幾種可供選擇:
Vibrant (有活力)
Vibrant dark(有活力 暗色)
Vibrant light(有活力 亮色)
Muted (柔和)
Muted dark(柔和 暗色)
Muted light(柔和 亮色)
可以利用Palette做其他更多的事情,比如titleBar的顏色和背景保持一致等等
大概的實現原理:
/**
* 第一步,將圖片縮小,再整個過程中,可以降低計算量和減少內存的使用,跟不縮小也能達到一樣的效果
* 第二步,將縮小後的圖片數據,放在一個int 數組裏
* 第三步,將這個int 數組由小到大排序,就相當於,將一張圖片一樣的顏色堆在一起,然後計算共有多少種顏色,
* 每種顏色它是多大,這些是在一個叫ColorHistogram(顏色直方圖)類裏面計算的,用顏色直方圖來說,
* 就是共有多少柱顏色,每柱顏色有多高
* 第四步,將各種顏色,根據RGB轉HSL算法,得出對應的HSL
* (H: Hue 色相,S:Saturation 飽和度L Lightness 明度),根據特定的條件,
* 比如是明度L是否接近白色,黑色,還有一個判斷叫isNearRedILine,
* 解釋是@return true if the color lies close to the red side of the I line
* (接近紅色私密區域附近?).,然後根據這三個條件,過濾掉這些顏色,什麼是HSL和RGB轉HSL算法可以查看下百科,
* 比較有詳細說明
* 第五步,根據是各種亮度,飽和度的取值範圍,比如有活力的暗色,有活力的亮色,柔和的顏色,柔和的暗色,
* 柔和的亮色,找到對應的顏色
*
*/
---------------------
每天進步一點點
----------------------