Palette是干嘛的?
Palette是从Bitmap中提取颜色,然后可以把这个颜色设置给背景色、toolbar、TextView等等控件,使界面保持颜色风格统一协调。
效果预览:
动图太大无法上传,用几张静图以示效果。
如何使用?
使用非常简单,下面会做简单介绍。不过在使用的时候发现Palette的方法已经被打上了横线(过时了!(⊙﹏⊙)),不知道谷歌是使用了更好的方法代替还是怎么(暂不研究),这个对于大多数人来说还是比较新的知识或是大多数应用还没有使用的功能就已经被打上了过时的标签,看来学习新知识的速度要加快啊!
使用场景?
目前多见于viewPager的滑动或ListView的滑动时根据不同的背景图片资源提取其颜色并设置主题的颜色。
注:要使用Palette需要android-support-v7-palette.jar这个jar包,如果没有请更新SDK,更新后在
…\sdk\extras\android\support\v7\palette文件夹下。
核心方法与代码:
private static final int[] drawables = {R.mipmap.a3, R.mipmap.a2, R.mipmap.a3, R.mipmap.a2};
private void colorChange(int position) {
// 用来提取颜色的Bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), drawables[position]);
// 使用Palette来设置从Bitmap中提取出的颜色
Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
Palette.Swatch vibrantSwatch = palette.getVibrantSwatch();
if (vibrantSwatch == null) return;
toolbar.setBackgroundColor(vibrantSwatch.getRgb());
if (android.os.Build.VERSION.SDK_INT >= 21) {
Window window = getWindow();
//顶部状态栏颜色加深
window.setStatusBarColor(colorBurn(vibrantSwatch.getRgb()));
}
tabs.setBackgroundColor(vibrantSwatch.getRgb());
}
});
}
Palette的使用需要一个Bitmap对象,这里使用的是本地的图片资源,第二个参数是图片资源的ID
使用Palette的generateAsync()方法,参数1是要提取颜色的bitmap,参数2是一个Listener,并在其onGenerated()方法中进行提取出来的颜色设置就ok了。
本例中是设置了toolbar的背景和TabLayout的tabs的背景。
需要注意的是
Palette.Swatch vibrantSwatch = palette.getVibrantSwatch();
可能为空,最好要加上判断:
if (vibrantSwatch == null) return;
颜色加深的方法:
/*
* 颜色加深处理
* */
private int colorBurn(int RGBValues) {
int red = RGBValues >> 16 & 0xFF;
int green = RGBValues >> 8 & 0xFF;
int blue = RGBValues & 0xFF;
red = (int) Math.floor(red * (1 - 0.1));
green = (int) Math.floor(green * (1 - 0.1));
blue = (int) Math.floor(blue * (1 - 0.1));
return Color.rgb(red, green, blue);
}
如果是ViewPager,就在Pager切换的方法中拾取并改变页面的颜色就ok了,如果是ListView,就判断listView滑动到哪个item然后拾取并改变页面颜色。
Demo下载地址:
http://download.csdn.net/detail/breeze_wf/9273313
参考:
http://blog.csdn.net/bbld_/article/details/41439715