最近想实现从一张图片中,获取它的颜色,设置给其余控件,以使得 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‘
获取Palette对象有同步
和异步
两种方式,建议使用异步获取Palette对象。
Palette palette = Palette.from(bitmap).generate();
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
}
});
可以获取到以下几种色样,但是有的时候获取不到对应的色样对象,必须注意非空判断。
| 色样| 颜色|
| ---------- |:-----------:|
|DominantSwatch|最突出的颜色|
|VibrantSwatch|有活力的颜色|
|DarkVibrantSwatch|有活力的暗色|
|LightVibrantSwatch|有活力的亮色|
|MutedSwatch|柔和的颜色|
|DarkMutedSwatch|柔和的暗色|
|LightMutedSwatch|柔和的亮色|
////获取有活力的颜色
final Palette.Swatch swatch1 = palette.getDarkVibrantSwatch();
//非空判断
if (swatch1 != null) {
}
得到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可以设置回调类型
原文:https://www.cnblogs.com/guowenrui/p/10362483.html