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