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

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

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

时候有了根据服务端传来的颜色动态改变progressbar的需求。

先看看以前的通过drawable资源文件的一般方式,首先定义一个progress_test.xml



    
        
            
            
        
    
    
    
        
            
                
                
            
        
    

然后在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:遇到的问题解决后记下来,以防自己以后忘记,也希望能给遇见同样问题的同行们提供一点帮助


你可能感兴趣的:(android)