- Palette 简介
Google Palette 是一个用来提取图片平均颜色的工具
最常用的做法就是根据封面来设置详情页面的title 颜色
例如:
在这个例子里,可以看到,使用了视频图片的主要的两个颜色作为title 背景和简介文字的背景
2. Palette 使用
首先先添加依赖
如果你用的是support-v7 的
implementation 'com.android.support:palette-v7:24.2.1'
如果是androidX 的
implementation "androidx.palette:palette:1.0.0"
Palette 使用,有同步和异步两种模式,因为会涉及解析图片的问题,所以遇到大图片或者低性能机,有可能会用更多时间去处理。所以建议使用异步方式去解析
eg:其中resource 是一个Bidmap 对象,所以如果是网络图片的话,需要自己去用Glide 等工具下载后使用
异步:
Palette.from(resource).generate { palette ->
//do SomeThing
}
同步:
val palette = Palette.from(resource).generate()
//do someThing
通过以上两种方式都可以获取到的Palette 对象
通过getXX 方法可以获取到以下各种模式的 Palette.Swatch 对象
* Vibrant //艳丽
* Vibrant Dark //艳丽暗色
* Vibrant Light //艳丽亮色
* Muted //柔和
* Muted Dark // 柔和暗色
* Muted Light //柔和亮色
然后getRGB 就可以获取到我们一般使用的颜色值
eg: 示例图,我所使用的是,title > darkVibrantSwatch ,text > darkMutedSwatch 参考比较一下
-
注意问题
在获取Swatch 时有一定几率会获取到null ,所以防止空指针时注意要判空处理 -
完整代码
Palette.from(resource).generate { palette ->
//获取到合适颜色Swatch
var vibrantTitle = palette?.darkVibrantSwatch
var vibrantbody = palette?.darkMutedSwatch
//当为空时,获取解析到的第一位作为备选
if (vibrantTitle == null && palette?.swatches?.size != 0) {
vibrantTitle = palette?.swatches?.get(0)
}
if (vibrantbody == null && palette?.swatches?.size != 0) {
vibrantbody = palette?.swatches?.get(0)
}
//设置颜色
vibrantTitle?.let {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.statusBarColor = vibrantTitle.rgb
app_bar.setBackgroundColor(vibrantTitle.rgb)
}
}
vibrantbody?.let {
ll_root.setBackgroundColor(vibrantbody.rgb)
}
}