web-dev-qa-db-fra.com

Changer la couleur de la barre de progression via CODE UNIQUEMENT dans Android

J'ai un progressBar utilisant la classe ProgressBar.

Je fais juste ceci:

progressBar = new ProgressBar(this, null, Android.R.attr.progressBarStyleHorizontal);

Je dois changer la couleur de celui-ci, en utilisant la valeur d'entrée comme ceci:

int color = "red in RGB value".progressBar.setColor(color)

ou quelque chose comme ça...

Je ne peux pas utiliser un disposition XML car la barre de progression est personnalisable pour les utilisateurs.

50
hico

Comme j'ai trouvé de l'aide sur un sujet ici mais que je ne me souviens pas du lien, je publie ma solution complète qui fonctionne très bien pour mes besoins:

    // Draw a simple progressBar from xml
    progressBar = new ProgressBar(this, null, Android.R.attr.progressBarStyleHorizontal);

    // Convert the color (Decimal value) to HEX value: (e.g: #4b96a0)
    String color = colorDecToHex(75, 150, 160);

    // Define a shape with rounded corners
    final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
    ShapeDrawable pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners,     null, null));

    // Sets the progressBar color
    pgDrawable.getPaint().setColor(Color.parseColor(color));

    // Adds the drawable to your progressBar
    ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
    progressBar.setProgressDrawable(progress);

    // Sets a background to have the 3D effect
    progressBar.setBackgroundDrawable(Utils.getActivity().getResources()
            .getDrawable(Android.R.drawable.progress_horizontal));

    // Adds your progressBar to your layout
    contentLayout.addView(progressBar);

Et voici le code pour convertir les valeurs de couleur DECIMAL en HEXADECIMAL:

public static String colorDecToHex(int p_red, int p_green, int p_blue)
{
    String red = Integer.toHexString(p_red);
    String green = Integer.toHexString(p_green);
    String blue = Integer.toHexString(p_blue);

    if (red.length() == 1)
    {
        red = "0" + red;
    }
    if (green.length() == 1)
    {
        green = "0" + green;
    }
    if (blue.length() == 1)
    {
        blue = "0" + blue;
    }

    String colorHex = "#" + red + green + blue;
    return colorHex;
}

Je pense que la dernière méthode n'est pas si propre mais elle fonctionne bien.

J'espère que cela vous aidera, trop de temps perdu sur cette barre de progression.

19
hico

Cela aidera beaucoup pas besoin de faire autant de codage :)

ProgressBar spinner = new Android.widget.ProgressBar(
            context,
            null,
            Android.R.attr.progressBarStyle);

spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000,Android.graphics.PorterDuff.Mode.MULTIPLY);
48
Mit Bhatt

Dans le cas où vous devez teinter l'arrière-plan et la barre de progression de différentes couleurs.

progress_drawable.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 Android:shape="rectangle" >
            <solid Android:color="@color/white" />
        </shape>
    </item>
    <item Android:id="@Android:id/progress">
        <clip>
            <shape>
                <solid Android:color="@color/green" />
            </shape>
        </clip>
    </item>
</layer-list>

Il est possible, par programmation, de décomposer ses éléments de liste de calques et de les colorer séparément:

LayerDrawable progressBarDrawable = (LayerDrawable) progressBar.getProgressDrawable();
Drawable backgroundDrawable = progressBarDrawable.getDrawable(0);
Drawable progressDrawable = progressBarDrawable.getDrawable(1);

backgroundDrawable.setColorFilter(ContextCompat.getColor(this.getContext(), R.color.white), PorterDuff.Mode.SRC_IN);
progressDrawable.setColorFilter(ContextCompat.getColor(this.getContext(), R.color.red), PorterDuff.Mode.SRC_IN);
32
brbsBruno

Mise à jour

Dans les versions plus récentes de Android (21 œuvres), vous pouvez modifier la couleur d'une barre de progression par programme en utilisant simplement setProgressTintList.

Pour le mettre en rouge, utilisez:

//bar is a ProgressBar
bar.setProgressTintList(ColorStateList.valueOf(Color.RED));
18
Jose M Vidal

Il est possible de coloriser la barre de progression en définissant le filtre de couleur sur la barre de progression dessinable:

Drawable drawable = progressBar.getProgressDrawable();
drawable.setColorFilter(new LightingColorFilter(0xFF000000, customColorInt));
13
Moritz

Cela fonctionne pour moi avec AppCompat: DrawableCompat.setTint (progressBar.getProgressDrawable (), tintColor);

7
Lubos Ilcik

si vous souhaitez modifier la couleur de la barre de progression par programme, vous copiez après ce code, cela fonctionne à 100%

 mainProgressBar.getIndeterminateDrawable().setColorFilter(Color.GREEN, PorterDuff.Mode.MULTIPLY);   
5
Pir Fahim Shah

progressbar.setIndeterminateTintList(ColorStateList.valueOf(Color.RED));

Cela ne fonctionne qu'au-dessus de l'API 21

4
Daniel Park

J'ai donné couleur par défaut in xml by drawable.

Je l'ai changé par programme.

activity_splasg.xml:

<ProgressBar
       Android:id="@+id/splashProgressBar"
       Android:progressDrawable="@drawable/splash_progress_drawable"
       Android:layout_width="match_parent"
       Android:layout_height="wrap_content"
       Android:max="100"
       Android:progress="50"
       style="?android:attr/progressBarStyleHorizontal"
       Android:layout_alignParentBottom="true" />

splash_progress_drawable.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>
            <solid
                Android:color="@Android:color/transparent" />
        </shape>
    </item>

    <item
        Android:id="@Android:id/progress">
        <clip>
            <shape>
                <solid
                    Android:color="#e5c771" />
            </shape>
        </clip>
    </item>

</layer-list>

Maintenant, comment changer ProgressDrawable color par programme.

ProgressBar splashProgressBar = (ProgressBar)findViewById(R.id.splashProgressBar);

Drawable bgDrawable = splashProgressBar.getProgressDrawable();
bgDrawable.setColorFilter(Color.BLUE, Android.graphics.PorterDuff.Mode.MULTIPLY);
splashProgressBar.setProgressDrawable(bgDrawable);

J'espère que ceci vous aidera.

3
Hiren Patel

Ce message est ce que vous recherchez: Comment changer la couleur de progression de la barre de progression dans Android

Si vous souhaitez que l'utilisateur choisisse ses propres couleurs, créez simplement des fichiers XML à dessins multiples pour chaque couleur et sélectionnez-les en fonction du choix de l'utilisateur.

1
Cruceo

Layout = activity_main.xml:

<ProgressBar
    Android:id="@+id/circle_progress_bar_middle"
    style="?android:attr/progressBarStyleHorizontal"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_centerInParent="true"
    Android:max="100"
    Android:rotation="-90"
    Android:indeterminate="false"
    Android:progressDrawable="@drawable/my_drawable_settings2" />

Dans Java Activité/Fragment:

ProgressBar myProgressBar = (ProgressBar) view.findViewById(R.id.circle_progress_bar_middle);
myProgressBar.setProgressDrawable(getResources().getDrawable(R.my_drawable_settings1));

Le fichier my_drawable_settings1.xml dans votre dossier drawable/mipmap:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item Android:id="@Android:id/progress">
        <shape
            Android:innerRadius="55dp"
            Android:shape="ring"
            Android:thickness="9dp"
            Android:useLevel="true">

            <gradient
                Android:startColor="#3594d1"
                Android:endColor="@color/white"
                Android:type="sweep" />
        </shape>
    </item>
</layer-list>

Où my_drawable_settings1 et my_drawable_settings2.xml a des couleurs différentes.

1
Gene