在做沉浸式状态栏时,需要实现状态栏字体颜色随背景深浅改变,深色背景显示亮色文字,浅色背景显示深色文字,看了郭霖的文章(一个Android沉浸式状态栏上的黑科技_guolin的博客-CSDN博客_android 沉浸式 郭霖)后,决定用Palette实现,代码如下:
Palette.from(bitmap).maximumColorCount(count).setRegion(left, top, right, bottom)
.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(@androidx.annotation.Nullable @Nullable Palette palette) {
Palette.Swatch mostPopularSwatch = null;
for (Palette.Swatch swatch : palette.getSwatches()) {
if (mostPopularSwatch == null
|| swatch.getPopulation() > mostPopularSwatch.getPopulation()) {
mostPopularSwatch = swatch;
}
}
if (mostPopularSwatch != null){
double luminance = ColorUtils.calculateLuminance(mostPopularSwatch.getRgb());
// 当luminance小于0.5时,我们认为这是一个深色值.
mIsDarkBack = luminance < 0.5;
if (luminance < 0.5) {
setLightStatusBar();
} else {
setDarkStatusBar();
}
}
}
});
但是这样会有一个问题,当选取范围是纯黑和纯白时palette.getSwatches()是空的,就无法判断是深色还是浅色背景。
解决方法:
多调用一个.clearFilters()方法,代码如下:
Palette.from(bitmap).maximumColorCount(count).setRegion(left, top, right, bottom)
.clearFilters().generate(...);//...为回调方法,上面已列出