我想动态更新ProgressBar Color,以便与实时更改的应用程序布局相匹配。 想法是根据设置的值更改颜色。 我找到了一些解决方案,但似乎很重要的是让动画每秒更新动画几次。
答案 0 :(得分:4)
使用ProgressBar的方法:
public void setProgressDrawable (Drawable d)
以不同颜色传递Drawable,例如ColorDrawable具有setColor(int color)方法。
要动态更改png可绘制颜色,请尝试:How to change colors of a Drawable in Android?
编辑:
ProgressBar drawable是LayerDrawable,如下所示:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:drawable/screen_progress_frame" />
<item>
<scale scaleWidth="100%" scaleGravity="0x3" drawable="@android:drawable/screen_progress_inner" />
</item>
</layer-list>
它有您想要着色的ScaleDrawable。
创建您自己的类似于上面的LayerDrawable并提取条形图并更改它的颜色。
答案 1 :(得分:0)
这是您可以在代码中使用的解决方案(基于pawelzieba的解决方案)。
ProgressBar progressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleHorizontal);
progressBar.setProgressDrawable(new LayerDrawable(
new Drawable[] {
new ColorDrawable(Color.RED),
new ScaleDrawable(new ColorDrawable(Color.GREEN), Gravity.LEFT, 1, -1),
}));
...
progressBar.setProgress(20);
答案 2 :(得分:0)
嗯,对于任何想要以编程方式进行操作的人:不要忘记将ids设置为Drawables!
Drawable bckgrndDr = new ColorDrawable(Color.RED);
Drawable secProgressDr = new ColorDrawable(Color.GRAY);
Drawable progressDr = new ScaleDrawable(new ColorDrawable(Color.BLUE), Gravity.LEFT, 1, -1);
LayerDrawable resultDr = new LayerDrawable(new Drawable[] { bckgrndDr, secProgressDr, progressDr });
//setting ids is important
resultDr.setId(0, android.R.id.background);
resultDr.setId(1, android.R.id.secondaryProgress);
resultDr.setId(2, android.R.id.progress);
将ids设置为drawable是至关重要的,并负责保留边界和进度条的实际状态。
(它看起来由vmayatskii提出的解决方案有效 - 但只有当你调用setProgress(value)aftrawards时,这个值必须与当前进度值不同)