android 如何根据前景图片动态改变状态栏的颜色?

How to change color of status bar dynamically in android based upon the foreground image?

我想实现我们在 WhatsApp 中看到的相同功能,当看到一个人的个人资料时,状态栏的颜色会根据 根据图像的颜色。

它叫做 Pallete,使用下面的函数,只需传递您的位图图像即可

  private void setUpPalette(Bitmap bitmap) {
   // you passed your Bitmap image;
    Palette.from(bitmap).
            generate(new Palette.PaletteAsyncListener() {
                @Override
                public void onGenerated(Palette palette) {
                    if (palette != null) {

                       //default color is yellow
                       // set the color to toolbar, whatever
                        int extColor = palette.getVibrantColor(ContextCompat.getColor(MainActivity.this, R.color.yellow));
                         if (getWindow() != null) {
                                getWindow().setStatusBarColor(ContextCompat.getColor(this, extColor));
                                }
                    } else {
                         if (getWindow() != null) {
                                    getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.fail_safe));
                                                    }
                    }
                }
            });
}

你会发现图像中最鲜艳的颜色,你可以改变 getWindow().setStatusBarColor(getResources().getColor(R.color.color));

你必须使用 Palette library 来获得主色:

// Generate palette asynchronously and use it on a different
// thread using onGenerated()
public void changeStatusBarColorAsync(Bitmap bitmap) {
  Palette.from(bitmap).generate(new PaletteAsyncListener() {
    public void onGenerated(Palette p) {
      // Use generated instance
      Palette.Swatch vibrant = p.getVibrantSwatch();
      int color = ContextCompat.getColor(getContext(),R.color.default_title_background);
      if(vibrant != null){
        color = vibrantSwatch.getTitleTextColor();
      }
      getWindow().setStatusBarColor(ContextCompat.getColor(this, color));
    }


  });
}