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算法可以查看下百科,
	 *        比较有详细说明
	 * 第五步,根据是各种亮度,饱和度的取值范围,比如有活力的暗色,有活力的亮色,柔和的颜色,柔和的暗色,
	 * 		柔和的亮色,找到对应的颜色
	 * 
	 */


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

每天进步一点点

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




你可能感兴趣的:(Android)