Android:以编程方式将颜色设置为 ProgressBar

Posted

技术标签:

【中文标题】Android:以编程方式将颜色设置为 ProgressBar【英文标题】:Android: set color programmatically to ProgressBar 【发布时间】:2015-09-20 21:26:12 【问题描述】:

我想以编程方式为进度条设置颜色primaryProgress,secondaryProgress,因为颜色会根据屏幕的背景颜色而改变。

代码:

LayerDrawable progressDrawable = (LayerDrawable) ProgressBar1.getProgressDrawable();
Drawable backgroundColor = progressDrawable.getDrawable(0);
Drawable secondaryColor = progressDrawable.getDrawable(1);
Drawable primaryColor = progressDrawable.getDrawable(2);

final float[] roundedCorners = new float[]  5, 5, 5, 5, 5, 5, 5, 5 ;
primaryColor = new ShapeDrawable(new RoundRectShape(roundedCorners, null, null));
secondaryColor = new ShapeDrawable(new RoundRectShape(roundedCorners, null, null));

primaryColor.setColor((Color.rgb(color_normal[0], color_normal[1], color_normal[2])), null);
secondaryColor.setColor((Color.rgb(color_normal[0], color_normal[1], color_normal[2])), null);

progressDrawable.setDrawableByLayerId(progressDrawable.getId(2), new ClipDrawable(primaryColor, Gravity.LEFT, ClipDrawable.HORIZONTAL));

...

编辑:

** 这里的颜色代码仅用于测试。之后颜色代码将被引用到其他部分进行相应的更新

    secondaryColor.setColorFilter((Color.rgb(255, 0, 0)), PorterDuff.Mode.SRC_OVER);
    primaryColor.setColorFilter((Color.rgb(0, 255, 213)), PorterDuff.Mode.SRC_OVER);        

    progressDrawable.setDrawableByLayerId(progressDrawable.getId(2), new ClipDrawable(primaryColor, Gravity.LEFT, ClipDrawable.HORIZONTAL));
    progressDrawable.setDrawableByLayerId(progressDrawable.getId(1), new ClipDrawable(secondaryColor, Gravity.LEFT, ClipDrawable.HORIZONTAL));
    ProgressBar1.setProgressDrawable(progressDrawable); 
    ProgressBar1.setProgress(progress);
    ProgressBar1.setSecondaryProgress(secondaryProgress);

问题:

primanyColor.setColor 用红色下划线表示The method setColor(int, null) is undefined for the type Drawable

如何修改上述代码以使其正常工作?谢谢!

【问题讨论】:

primaryColor.getPaint().setColor(Color.rgb(color_normal[0], color_normal[1], color_normal[2])); 谢谢。我也尝试过,但出现错误:The method getPaint() is undefined for the type Drawable @pearmak: ok 然后用primaryColor.setColorFilter方法做 然后ShapeDrawable primaryColor @ρяσѕρєяK:非常感谢!它现在正在工作!如果您在编辑部分发布答案会很高兴 【参考方案1】:

这是通过编程为 min sdk 版本 21 及更高版本更改 ProgressBar 颜色的代码

ProgressBar myProgress = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
myProgress.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));

【讨论】:

min sdk 为 21 .【参考方案2】:

您可以做的是首先通过 xml 使您的图层列表可绘制(意味着作为第一层的背景,作为第二层的表示次要进度的可绘制对象,以及表示作为第二层的另一个可绘制对象作为最后一层的主要进度),然后通过执行以下操作更改代码上的颜色:

public void setPrimaryProgressColor(int colorInstance) 
      if (progressBar.getProgressDrawable() instanceof LayerDrawable) 
        Log.d(mLogTag, "Drawable is a layer drawable");
        LayerDrawable layered = (LayerDrawable) progressBar.getProgressDrawable();
        Drawable circleDrawableExample = layered.getDrawable(<whichever is your index of android.R.id.progress>);
        circleDrawableExample.setColorFilter(colorInstance, PorterDuff.Mode.SRC_IN);
        progressBar.setProgressDrawable(layered);
     else 
        Log.d(mLogTag, "Fallback in case it's not a LayerDrawable");
        progressBar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
    

此方法将为您提供最大的灵活性,让您在 xml 上声明原始可绘制对象的测量值,之后无需修改其结构,特别是如果您需要特定于 xml 文件屏幕文件夹,那么只需修改通过代码颜色。无需从头开始重新实例化新的 ShapeDrawable。

【讨论】:

在 ViewHolder 中使用时,这会使我的应用崩溃。 3 件事: - 确保您的进度条不为空 - 确保您的进度条在其 xml 布局上使用可绘制的图层列表 - 确保您的图层列表在 xml 中标识了每个项目:​​ 是的,进度条不为空。是的,我的进度条正在使用可绘制的图层列表。是的,不幸的是它同时拥有 3 个 :( 无论如何,谢谢。我使用 progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED)); 解决了它 layer-listdrawable 的完美解决方案。 而不是使用 layered.getDrawable(),使用 layered.findDrawableByLayerId(android.R.id.progress) 更不容易出错跨度> 【参考方案3】:

要为 Drawable 设置颜色,请使用 Drawable.setColorFilter。喜欢:

primaryColor.setColorFilter((Color.rgb(0,128,0)), 
                                                 PorterDuff.Mode.SRC_OVER);        

【讨论】:

以上是关于Android:以编程方式将颜色设置为 ProgressBar的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将颜色设置为 Cayenne

以编程方式“闪烁” UITableViewCell 将背景颜色设置为白色

如何以编程方式将 Activity 的背景颜色设置为白色?

Xamarin Android:以编程方式从 colors.xml 获取颜色值

在 Android 11 (API 30) 中以编程方式更改状态栏文本颜色

Android-以编程方式获取列表视图(项目)的背景颜色