Android 5.x新特性之利用Palette獲取圖片的主題色

在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算法可以查看下百科,
	 *        比較有詳細說明
	 * 第五步,根據是各種亮度,飽和度的取值範圍,比如有活力的暗色,有活力的亮色,柔和的顏色,柔和的暗色,
	 * 		柔和的亮色,找到對應的顏色
	 * 
	 */


---------------------

每天進步一點點

----------------------




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章