我使用Palette作为动态状态栏背景颜色。对于白色,状态栏颜色应为TranslucentStatus,其他颜色应为透明色,并通过调色板设置颜色。
Glide.with(fragmentContext)
.load(offerData.getOfferImage())
.into(new ImageViewTarget<GlideDrawable>(imgViewOffer) {
@Override
protected void setResource(GlideDrawable resource){
setImage(resource);
extractColor(resource);
}
private void setImage(GlideDrawable resource) {
imgViewOffer.setImageDrawable(resource.getCurrent());
}
private void extractColor(GlideDrawable resource) {
Bitmap b = ((GlideBitmapDrawable) resource.getCurrent()).getBitmap();
Palette p = Palette.from(b).generate();
int defaultColor = fragmentContext.getResources().getColor(R.color.white);
int whiteColor = fragmentContext.getResources().getColor(R.color.white);
int color = p.getDarkVibrantColor(defaultColor);
if ((whiteColor == color)) {
setTransparentStatusBar(false);
} else {
setTransparentStatusBar(true);
}
}
});private void setTransparentStatusBar(boolean isCheckStatus) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window w = getActivity().getWindow();
if (isCheckStatus) {
w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
} else {
w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
}
答案 0 :(得分:0)
我会提出另一种方法来做到这一点,它不仅与调色板一样好,而且更好,更快,更容易。
将此浮动方法写入您想要的任何活动,将颜色插入其中,它可以为您提供该颜色的亮度。
public float Lightness(int color){
int red = Color.red(color);
int green = Color.green(color);
int blue = Color.blue(color);
float hsl[] = new float[3];
ColorUtils.RGBToHSL(red, green, blue, hsl);
return hsl[2];
}
现在你可以像这样在任何地方使用它:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
float lightness = Lightness(YOUR_COLOR);
if (lightness >= 0.5) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else if (lightness < 0.5) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
你也可以在调色板中使用它,如下所示:
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
float color = Lightness(palette.getVibrantColor(Enter_A_Default_Color_Here));
if (color >= 0.5) {
// ---- Use Dark Color
} else if (color < 0.5) {
// ---- Use Light Color
}
}
});
答案 1 :(得分:0)
您可以仅为api大于21更改状态栏颜色使用调色板库从图像(refer this和Palette documentation)中提取调色板,然后使用
window.setStatusBarColor
答案 2 :(得分:0)
请注意,我更改了Palette,Palette与Glide.with(fragmentContext).load(offerData.getOfferImage())
.into(new ImageViewTarget < GlideDrawable > (imgViewOffer) {
@Override
protected void setResource(GlideDrawable resource) {
setImage(resource);
extractColor(resource);
}
private void setImage(GlideDrawable resource) {
imgViewOffer.setImageDrawable(resource.getCurrent());
}
private void extractColor(GlideDrawable resource) {
Bitmap b = ((GlideBitmapDrawable) resource.getCurrent()).getBitmap();
Palette.from(b).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
int defaultColor = fragmentContext.getResources().getColor(R.color.white);
int color = palette.getDominantColor(defaultColor);
setTransparentStatusBar(color);
}
});
}
});
private void setTransparentStatusBar(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
float lightness = Lightness(color);
if (lightness >= 0.5) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else if (lightness < 0.5) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
的效果更好。
此外,您不需要任何其他内容。
因为在这里你正在提取图像的DOMINANT颜色,所以毫无疑问它会为你挑选最好的颜色
private Float Lightness(...)...
不要忘记添加{{1}}