如何使用调色板动态更改状态栏颜色?

时间:2018-01-31 07:13:56

标签: android android-layout android-fragments

我使用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);
        }
    }
}

3 个答案:

答案 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 thisPalette 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}}