通过代码动态更改progressbar的颜色

本文介绍了一种在Android中根据服务端传来的颜色动态更改ProgressBar颜色的方法。通过使用LayerDrawable、ClipDrawable等类,实现了不同等级的经验条颜色变化,无需预先定义所有样式。

因为项目突然需要一个等级的经验条显示,并且经验条的颜色需要跟随等级的不同而变化,

而目前也不确定等级的上限,颜色的数量无法确定,所以不能在本地写死所有的样式,这

时候有了根据服务端传来的颜色动态改变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:遇到的问题解决后记下来,以防自己以后忘记,也希望能给遇见同样问题的同行们提供一点帮助


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值