Android: set color programmatically to ProgressBar
Asked Answered
H

3

9

I would like to set color programmatically to the progress bar primaryProgress, secondaryProgress as the color will be changed according to the background color of the screen.

Code:

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));

...

Edit:

** the color code here are for testing only. Afterwards the colorcode will be referenced to other part for updates accordingly

    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);

Question:

It underlines in red for primanyColor.setColor and reports that The method setColor(int, null) is undefined for the type Drawable .

How could I modify the above codes to make it works? Thanks!

Hide answered 3/7, 2015 at 6:28 Comment(10)
Do primaryColor.getPaint().setColor(Color.rgb(color_normal[0], color_normal[1], color_normal[2]));Android
Thanks. I have tried that too and that gives error: The method getPaint() is undefined for the type DrawableHide
@pearmak: ok Then do it using primaryColor.setColorFilter methodRiancho
make it ShapeDrawable primaryColor thenAndroid
I think you can get something from here!!-----> geeks.gallery/horizontal-and-circular-progress-bar-in-android 101apps.co.za/articles/android-s-progress-bars.html tiemenschut.com/how-to-customize-android-progress-barsFerrin
@AmarbirSingh: Thanks for the link. I have also researched such 2 links before but they are through xml instead of programmatically which seem unable to serve the request of changing colors according to the background color of screen dynamically.Hide
@ρяσѕρєяK: thanks for your direction, I have tried using setColorFilter as advised, with the rule that secondaryprogress must be greater than the primanyprogress, I dont know why it just showing the secondaryprogress (red) only. Pls see the updated code in the questions... thanks a lot!Hide
@pearmak: try some different color for primany like (0,128,0)Riancho
#10952478Ferrin
@ρяσѕρєяK: Thanks a lot! It is working now! It would be pleasure if you post an answer as that in the Edit partHide
S
2

To set colors for Drawable use Drawable.setColorFilter. like:

primaryColor.setColorFilter((Color.rgb(0,128,0)), 
                                                 PorterDuff.Mode.SRC_OVER);        
Soukup answered 3/7, 2015 at 7:13 Comment(0)
A
5

Here is the code for changing the color of ProgressBar by programatically for min sdk version 21 and above

ProgressBar myProgress = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
myProgress.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));
Arrester answered 25/7, 2017 at 8:59 Comment(1)
min sdk is 21 .Floc
I
3

What you can do is make your layer-list drawable via xml first (meaning a background as the first layer, a drawable that represents secondary progress as the second layer, and another drawable that represents the primary progress as the last layer), then change the color on the code by doing the following:

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);
    }
}

This method will give you the best flexibility of having the measurement of your original drawable declared on the xml, WITH NO MODIFICATION ON ITS STRUCTURE AFTERWARDS, especially if you need to have the xml file screen folder specific, then just modifying ONLY THE COLOR via the code. No re-instantiating a new ShapeDrawable from scratch whatsoever.

Inextensible answered 30/6, 2016 at 14:50 Comment(5)
This will crash my app when using inside a ViewHolder.Labe
3 things: - Make sure your progressbar is not null - Make sure your progressbar is using a layer-list drawable on it's xml layout - Make sure that your layerlist has each item identified inside the xml: <item android:id="@android:id/background"> <item android:id="@android:id/secondaryProgress"> <item android:id="@android:id/progress">Inextensible
Yeah, progressbar is not null. And yes, my progressbar is using a layer-list drawable. And yes, unfortunately it has both 3 :( Thanks anyway. I solved it using progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));Labe
Perfect solution for layer-list drawable.Ivyiwis
instead using layered.getDrawable(<whichever is your index of android.R.id.progress>), use layered.findDrawableByLayerId(android.R.id.progress) which is less error proneRaptor
S
2

To set colors for Drawable use Drawable.setColorFilter. like:

primaryColor.setColorFilter((Color.rgb(0,128,0)), 
                                                 PorterDuff.Mode.SRC_OVER);        
Soukup answered 3/7, 2015 at 7:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.