Palette
Palette 单词本意是调色板的意思,所以在Android中Palette肯定会与颜色有关,它在作用是根据当前图片的Bitmap来获取到当前图片的主色调,从而我们可以去改变主题背景的颜色和字体的颜色达到界面色调统一,使界面美观协调。
Palette可以提取的颜色和提取方法如下:
- Vibrant------------getVibrantSwatch()-------------充满活力的
- VibrantDark------getDarkVibrantSwatch()------充满活力的暗色
- VibrantLight------getLightVibrantSwatch()------充满活力的亮色
- Muted--------------getMutedSwatch()--------------柔和的
- MutedDark--------getDarkMutedSwatch()-------柔和的暗色
- MutedLight--------getLightMutedSwatch()-------柔和的亮色
Palette类中嵌套了一个Swatch类,是用来获取调色板色彩样本的,比如:
private Palette.Swatch s1;
s1 = palette.getVibrantSwatch();
Swatch总共有5中方法:
getPopulation(): //获取当前颜色样本的色素数目
getRgb(): //获取当前颜色样本的RGB值
getHsl(): //获取当前颜色样本的Hsl值
getBodyTextColor(): // 适合该颜色样本的主体文字的颜色值
getTitleTextColor(): // 适合该颜色样本的标题文字的颜色值
Palette是通过Builder方法去创建Palette对象的,具体方法是
Palette.Builder(Bitmap).generate(PaletteAsyncListener)
其中第一个参数就是需要获取色素的图片的Bitmap,第二个参数就是一个Paletee类中的方法PaletteAsyncListener(),一般情况我们都会在里面new一个这个方法,让它自动生成onGenerated()方法。
new Palette.Builder(BitmapFactory.decodeResource(getResources(), imageId))
.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
}
});
在这个onGenerated()方法中我们去获取到当前的6种颜色样本,从这个方法的名字Async(PaletteAsyncListener)就可以看得出来这个方法本来就是异步的,所以在我们获取到了6中颜色样本之后,就可以在这个方法里面进行UI的色彩赋值了。
new Palette.Builder(BitmapFactory.decodeResource(getResources(), imageId))
.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
s1 = palette.getVibrantSwatch();
Log.d("XXX", String.valueOf(s1));
s2 = palette.getDarkVibrantSwatch();
s3 = palette.getLightVibrantSwatch();
s4 = palette.getMutedSwatch();
s5 = palette.getDarkMutedSwatch();
s6 = palette.getLightMutedSwatch();
if (s1 != null) {
iv1.setBackgroundColor(s1.getRgb());
s1.getPopulation();
}
if (s2 != null) {
iv2.setBackgroundColor(s2.getRgb());
}
if (s3 != null) {
iv3.setBackgroundColor(s3.getRgb());
}
if (s4 != null) {
iv4.setBackgroundColor(s4.getRgb());
}
if (s5 != null) {
iv5.setBackgroundColor(s5.getRgb());
}
if (s6 != null) {
iv6.setBackgroundColor(s6.getRgb());
}
}
});
我们会注意到在给s1-s6获取颜色完毕之后,我们在进行编辑色彩的时候,还是要去给它们判断一下是否为空,在这里我们必须去判断一下是否为空,因为如果面板无法找到相匹配的标准色,那么它就会返回为null,这样会导致空指针异常。
顺带提一下,Palette类本来的构造方法为
Palette p = Palette.generate(bitmap);//默认调色板色素大小为16
Palette p = Palette.generate(bitmap,24);//指定调色板色素的大小
异步为
Palette p = Palette.generateAsync(bitmap);
Palette p = Palette.generateAsync(bitmap,24);
现在已经被弃用。
Palette类需要传入当前图片的Bitmap,所以我们就需要获取到图片的Bitmap。获取本地图片Bitmap的方法为:
BitmapFactory.decodeResource(getResources(), imageId)
imageId中传入的就是这个图片所在的文件,例如R.mipmap.ic_launcher。
获取网络图片的Bitmap使用代码中写的getBitmap方法:
Bitmap bitmap =getBitmap(urlPath);
传入的参数就是String类型的图片网址,切记获取网络图片Bitmap要异步。