如何根据前景图像在android中动态更改状态栏的颜色?

Posted

技术标签:

【中文标题】如何根据前景图像在android中动态更改状态栏的颜色?【英文标题】:How to change color of status bar dynamically in android based upon the foreground image? 【发布时间】:2019-09-28 06:29:36 【问题描述】:

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

【问题讨论】:

Whatsapp 是什么?我的iphone上没有。我应该如何验证您所描述的情况?这就是为什么你应该清楚地提到你现在想要说的“我想要 XYZ 所做的事情”。 看看这个drive.google.com/file/d/1UC25E2z80zbEaEAD7NbtV-RwjKCNQ3Qw/… Finding the dominant color of an image in an android @drawable的可能重复 【参考方案1】:

它叫做 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));
                                                    
                    
                
            );

【讨论】:

extcolor 是 int 但 getcolor 方法需要资源的 id,因此它给了我错误 ContextCompat.getColor(context , id),第一个参数是上下文,第二个是id【参考方案2】:

您必须使用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));
    


  );

【讨论】:

【参考方案3】:

https://***.com/a/28145358/9186913你会发现图像中最鲜艳的颜色,你可以改变getWindow().setStatusBarColor(getResources().getColor(R.color.color));

【讨论】:

extcolor 是 int 但 getcolor 方法需要资源的 id,因此它给了我错误 是 extcolor 十六进制颜色??

以上是关于如何根据前景图像在android中动态更改状态栏的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改android状态栏的背景颜色

如何更改android中状态栏的颜色?

如何在带有深色主题的android上更改chrome中状态栏的颜色?

如何更改启动器中状态栏的颜色?

以编程方式更改搜索栏的进度绘图

如何根据它包含的标记数量在Android中更改集群图像?