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 中标识了每个项目:progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
解决了它
layer-list
drawable 的完美解决方案。
而不是使用 layered.getDrawable(要为 Drawable 设置颜色,请使用 Drawable.setColorFilter。喜欢:
primaryColor.setColorFilter((Color.rgb(0,128,0)),
PorterDuff.Mode.SRC_OVER);
【讨论】:
以上是关于Android:以编程方式将颜色设置为 ProgressBar的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式“闪烁” UITableViewCell 将背景颜色设置为白色
Xamarin Android:以编程方式从 colors.xml 获取颜色值