因为项目突然需要一个等级的经验条显示,并且经验条的颜色需要跟随等级的不同而变化,
而目前也不确定等级的上限,颜色的数量无法确定,所以不能在本地写死所有的样式,这
时候有了根据服务端传来的颜色动态改变progressbar的需求。
先看看以前的通过drawable资源文件的一般方式,首先定义一个progress_test.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="10dp" />
<solid android:color="@color/gray_d7d7d8" />
</shape>
</item>
<!-- 进度条 -->
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="10dp" />
<solid android:color="@color/main_cyan" />
</shape>
</clip>
</item>
</layer-list>
然后在progressbar布局中引用上面的文件就行了,
android:progressDrawable="@drawable/progress_test"
这是一般方法,但是如何在代码里面修改呢?ProgressBar提供了一个成员方法setProgressDrawable,
需传入一个Drawable,那么问题就是如何生成这个Drawable了(肯定不是读另外的资源文件啦,不然只是根据已有的样式做变化了)
对应上面的资源文件查了一些资料以后(楼主是新人,不要笑话)发现layer-list其实就是LayerDrawable,
那么解决方案就有啦,下面直接给上对应的代码,
ProgressBar bar = (ProgressBar) findViewById(R.id.pb_score);
int radius0 = DensityUtil.dip2px(this,10);
float[] outerR = new float[] { radius0, radius0, radius0, radius0, radius0, radius0, radius0, radius0 };
RoundRectShape roundRectShape1 = new RoundRectShape(outerR, null, null);
ShapeDrawable shapeDrawable1 = new ShapeDrawable();
shapeDrawable1.setShape(roundRectShape1);
shapeDrawable1.getPaint().setStyle(Paint.Style.FILL);
shapeDrawable1.getPaint().setColor(ContextCompat.getColor(this,R.color.main_cyan));
ClipDrawable clipDrawable = new ClipDrawable(shapeDrawable1, Gravity.LEFT, ClipDrawable.HORIZONTAL);
RoundRectShape roundRectShape0 = new RoundRectShape(outerR, null, null);
ShapeDrawable shapeDrawable = new ShapeDrawable();
shapeDrawable.setShape(roundRectShape0);
shapeDrawable.getPaint().setStyle(Paint.Style.FILL);
shapeDrawable.getPaint().setColor(ContextCompat.getColor(this,R.color.gray_d7d7d8));
Drawable[] layers = new Drawable[]{shapeDrawable,clipDrawable};
LayerDrawable layerDrawable = new LayerDrawable(layers);
layerDrawable.setId(0,android.R.id.background);
layerDrawable.setId(1,android.R.id.progress);
bar.setProgressDrawable(layerDrawable);
基本上就是每一个tag对应的都有一个类,然后做配置就行了
PS:遇到的问题解决后记下来,以防自己以后忘记,也希望能给遇见同样问题的同行们提供一点帮助