最近想实现从一张图片中,获取它的颜色,设置给其余控件,以使得 UI 页面的整体风格更加的美观和融洽。网上查询了一些资料,发现了一个Android 下比较有意思的 Support v7 库~~~
Palette
库可以从一张图片(Bitmap
)中提取出它突出的颜色,恰巧可以达到我的需求。
步骤
1、传递一个 Bitmap,得到一个 Palette。
2、获取Palette中指定的色样
3、从色样中提取相应的颜色。
开始使用
导包
在工程下的 build.gradle 里添加依赖才可以使用Palette,因为传递一个 Bitmap,得到一个Palette,我平常用的glide
库加载图片,所以后面我就用glide来获取Bitmap。
implementation 'com.android.support:palette-v7:27.1.1'
implementation 'com.github.bumptech.glide:glide:3.6.1'
1、获取Palette对象
获取Palette对象有同步
和异步
两种方式,建议使用异步获取Palette对象。
同步获取
Palette palette = Palette.from(bitmap).generate();
异步获取
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
}
});
2、获取Palette生成的色样
可以获取到以下几种色样,但是有的时候获取不到对应的色样对象,必须注意非空判断。
色样 | 颜色 |
---|---|
DominantSwatch | 最突出的颜色 |
VibrantSwatch | 有活力的颜色 |
DarkVibrantSwatch | 有活力的暗色 |
LightVibrantSwatch | 有活力的亮色 |
MutedSwatch | 柔和的颜色 |
DarkMutedSwatch | 柔和的暗色 |
LightMutedSwatch | 柔和的亮色 |
////获取有活力的颜色
final Palette.Swatch swatch1 = palette.getDarkVibrantSwatch();
//非空判断
if (swatch1 != null) {
}
3、从色样中提取相应的颜色。
得到Swatch
对象之后,就可以调用Swatch中的获取我们需要的颜色值。
//图片中的像素数量
swatch.getPopulation()
//颜色的RBG值
swatch.getRgb()
//颜色的HSL值
swatch.getHsl()
//主体文字的颜色值
swatch.getBodyTextColor()
//标题文字的颜色值
swatch.getTitleTextColor()
这是从我的项目中抽出来的代码,大家可以看看
Glide.with(MainActivity.this).load(music_pic).asBitmap().into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
music_message_music_iv.setImageBitmap(resource);
Palette.generateAsync(resource, new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
// palette为生成的调色板
final Palette.Swatch s1 = palette.getDarkVibrantSwatch();
if (swatch1 != null) {
linearLayout.setBackgroundColor(swatch1.getRgb());
}
}
});
}
}); //方法中设置asBitmap可以设置回调类型