progressbar Comment changer la couleur de progression de la barre de progression dans Android



android progressbar style (24)

Horizontal ProgressBar utilise la rectangle shape pour l'arrière-plan, ClipDrawable construit à partir de la rectangle shape du rectangle shape pour les progrès (primaire et secondaire). La teinte change les couleurs en une teinte. Si vous souhaitez des couleurs ciblées pour les trois séparément, vous pouvez utiliser ProgressBar.setProgressDrawable() comme suit:

    LayerDrawable progressBarDrawable = new LayerDrawable(
        new Drawable[]{
                new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
                            new int[]{Color.parseColor("#ff0000ff"),Color.parseColor("#ff0000ff")}),

                new ClipDrawable(
                            new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
                                    new int[]{Color.parseColor("#ff00ff00"),Color.parseColor("#ff00ff00")}),
                            Gravity.START,
                            ClipDrawable.HORIZONTAL),

                new ClipDrawable(
                        new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
                                new int[]{Color.parseColor("#ffff0000"),Color.parseColor("#ffff0000")}),
                        Gravity.START,
                        ClipDrawable.HORIZONTAL)
            });

    progressBarDrawable.setId(0,android.R.id.background);
    progressBarDrawable.setId(1,android.R.id.secondaryProgress);
    progressBarDrawable.setId(2,android.R.id.progress);
    ((ProgressBar)findViewById(R.id.progressBar)).setProgressDrawable(progressBarDrawable);

Notez que l'ordre des couches pouvant être dessinées est important lors de l'initialisation de LayerDrawable . Le premier tirable devrait être pour le fond. Selon mon expérience, le changement d'identifiant ne fonctionne pas. Si vous définissez le remplissage à la barre de progressbar cette approche ne fonctionnera pas. Si vous avez besoin de remplissage, vous pouvez utiliser un conteneur pour la LinearLayout progression, tel qu'un LinearLayout .

J'utilise une barre de progression horizontale dans mon application Android, et je veux changer sa couleur de progression (qui est jaune par défaut). Comment puis-je le faire en utilisant du code (pas XML)?


Answer #1

Pour un style ProgressBar horizontal, j'utilise:

import android.widget.ProgressBar;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.ClipDrawable;
import android.view.Gravity;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;

public void setColours(ProgressBar progressBar,
                        int bgCol1, int bgCol2, 
                        int fg1Col1, int fg1Col2, int value1,
                        int fg2Col1, int fg2Col2, int value2)
  {
    //If solid colours are required for an element, then set
    //that elements Col1 param s the same as its Col2 param
    //(eg fg1Col1 == fg1Col2).

    //fgGradDirection and/or bgGradDirection could be parameters
    //if you require other gradient directions eg LEFT_RIGHT.

    GradientDrawable.Orientation fgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;
    GradientDrawable.Orientation bgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;

    //Background
    GradientDrawable bgGradDrawable = new GradientDrawable(
            bgGradDirection, new int[]{bgCol1, bgCol2});
    bgGradDrawable.setShape(GradientDrawable.RECTANGLE);
    bgGradDrawable.setCornerRadius(5);
    ClipDrawable bgclip = new ClipDrawable(
            bgGradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);     
    bgclip.setLevel(10000);

    //SecondaryProgress
    GradientDrawable fg2GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg2Col1, fg2Col2});
    fg2GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg2GradDrawable.setCornerRadius(5);
    ClipDrawable fg2clip = new ClipDrawable(
            fg2GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Progress
    GradientDrawable fg1GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg1Col1, fg1Col2});
    fg1GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg1GradDrawable.setCornerRadius(5);
    ClipDrawable fg1clip = new ClipDrawable(
            fg1GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Setup LayerDrawable and assign to progressBar
    Drawable[] progressDrawables = {bgclip, fg2clip, fg1clip};
    LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);     
    progressLayerDrawable.setId(0, android.R.id.background);
    progressLayerDrawable.setId(1, android.R.id.secondaryProgress);
    progressLayerDrawable.setId(2, android.R.id.progress);

    //Copy the existing ProgressDrawable bounds to the new one.
    Rect bounds = progressBar.getProgressDrawable().getBounds();
    progressBar.setProgressDrawable(progressLayerDrawable);     
    progressBar.getProgressDrawable().setBounds(bounds);

    // setProgress() ignores a change to the same value, so:
    if (value1 == 0)
        progressBar.setProgress(1);
    else
        progressBar.setProgress(0);
    progressBar.setProgress(value1);

    // setSecondaryProgress() ignores a change to the same value, so:
    if (value2 == 0)
        progressBar.setSecondaryProgress(1);
    else
        progressBar.setSecondaryProgress(0);
    progressBar.setSecondaryProgress(value2);

    //now force a redraw
    progressBar.invalidate();
  }

Un exemple d'appel serait:

  setColours(myProgressBar, 
          0xff303030,   //bgCol1  grey 
          0xff909090,   //bgCol2  lighter grey 
          0xff0000FF,   //fg1Col1 blue 
          0xffFFFFFF,   //fg1Col2 white
          50,           //value1
          0xffFF0000,   //fg2Col1 red 
          0xffFFFFFF,   //fg2Col2 white
          75);          //value2

Si vous n'avez pas besoin de la 'progression secondaire', mettez simplement value2 à value1.


Answer #2

C'est une vieille question, mais l'utilisation du thème n'est pas mentionnée ici. Si votre thème par défaut utilise AppCompat , la couleur de votre ProgressBar sera colorAccent vous avez définie.

Changer colorAccent modifiera également la couleur de votre ProgressBar , mais il y aura aussi des changements à plusieurs endroits. Donc, si vous voulez une couleur différente juste pour un PregressBar spécifique, vous pouvez le faire en appliquant un thème à ce ProgressBar :

  • Étendez votre thème par défaut et remplacez colorAccent

    <style name="AppTheme.WhiteAccent">
        <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
    </style>
    
  • Et dans ProgressBar ajouter l'attribut android:theme :

    android:theme="@style/AppTheme.WhiteAccent"
    

Donc ça va ressembler à ça:

<ProgressBar
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="10dp"
        android:theme="@style/AppTheme.WhiteAccent" />

Vous modifiez simplement un colorAccent pour votre ProgressBar .

Remarque : l'utilisation du style ne fonctionnera pas. Vous devez utiliser android:theme uniquement. Vous pouvez trouver plus d'utilisation du thème ici: https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH


Answer #3

Posté pour ajouter des informations sur la réponse de PaulieG , puisque ateiob m'a demandé d'expliquer quelque chose ...

Malheureusement quand j'ai proposé une modification à la solution, c'était il y a longtemps, et je ne me souviens pas de tous les détails.

Je peux dire qu'il y a (ou au moins était, au moment de l'écriture quand j'ai regardé cette version actuelle du code source Android) un bug / problème / optimisation dans le code ProgressBar qui ignore une tentative de mettre la progression à une valeur c'est déjà à.

  • c'est-à-dire si la progression = 45, et vous essayez de le mettre à 45, le code ne fera rien, et ne redessinera pas la progression .

Après avoir appelé ProgressBar.setProgressDrawable() , votre barre de progression sera vide (parce que vous avez modifié la partie drawable).

Cela signifie que vous devez définir la progression et la redessiner. Mais si vous définissez simplement la progression sur une valeur préservée, cela ne fera rien.

Vous devez d'abord le mettre à 0, puis à nouveau à la "vieille" valeur, et la barre sera redessinée.

Donc, pour résumer:

  • préserver la "vieille" valeur de progrès
  • mettre à jour le dessinable / couleur (rend la barre vide)
  • réinitialiser la progression à 0 (sinon la ligne suivante ne fait rien)
  • réinitialiser la progression à l'ancienne valeur (barre de correction)
  • invalider

Voici une méthode que j'ai qui fait cela - j'espère que c'est utile. Je ne suis pas sûr à 100% pourquoi je l'ai appelé de onResume() - cela pourrait être important, ou non lié:

protected void onResume()
{
    super.onResume();
    progBar = (ProgressBar) findViewById(R.id.progress_base);

    int oldProgress = progBar.getProgress();

    // define new drawable/colour
    final float[] roundedCorners = new float[]
        { 5, 5, 5, 5, 5, 5, 5, 5 };
    ShapeDrawable shape = new ShapeDrawable(new RoundRectShape(
        roundedCorners, null, null));
    String MyColor = "#FF00FF";
    shape.getPaint().setColor(Color.parseColor(MyColor));
    ClipDrawable clip = new ClipDrawable(shape, Gravity.LEFT,
        ClipDrawable.HORIZONTAL);
    progBar.setProgressDrawable(clip);

    progBar.setBackgroundDrawable(getResources().getDrawable(
        android.R.drawable.progress_horizontal));

    // work around: setProgress() ignores a change to the same value
    progBar.setProgress(0);
    progBar.setProgress(oldProgress);

    progBar.invalidate();
}

En ce qui concerne la solution de HappyEngineer, je pense que c'était une solution de contournement similaire, pour définir manuellement le "progrès" décalage (je ne me souviens pas exactement). Dans les deux cas, le code ci-dessus devrait fonctionner pour vous.

Désolé si je ne me souviens pas de tous les détails - c'est pourquoi j'ai essayé d'éditer la réponse. J'espère que cela t'aides...


Answer #4

Il est si simple d'utiliser attr, si vous avez affaire à des applications multi-styles:

essayez de cette façon:

Déclarez ci-dessous l'attribut attrs.xml

 <attr name="circularProgressTheme" format="reference"></attr>

Coller sous le code dans styles.xml

 <style name="ProgressThemeWhite" parent="ThemeOverlay.AppCompat.Light">
        <item name="colorAccent">#FF0000</item>
    </style>

    <style name="circularProgressThemeWhite">
        <item name="android:theme">@style/ProgressThemeWhite</item>
    </style>


  <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

   <item name="circularProgressTheme">@style/circularProgressThemeWhite</item>

 </style>

utiliser la barre de progression comme ci-dessous

  <ProgressBar
        style="?attr/circularProgressTheme"
        android:id="@+id/commonProgress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:visibility="visible"/>

Answer #5

Je suis désolé que ce ne soit pas la réponse, mais qu'est-ce qui motive l'exigence de le définir à partir du code? Et .setProgressDrawable devrait fonctionner s'il est défini correctement

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@android:id/background">
    <shape>
        <corners android:radius="5dip" />
        <gradient
                android:startColor="#ff9d9e9d"
                android:centerColor="#ff5a5d5a"
                android:centerY="0.75"
                android:endColor="#ff747674"
                android:angle="270"
        />
    </shape>
</item>

<item android:id="@android:id/secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#80ffd300"
                    android:centerColor="#80ffb600"
                    android:centerY="0.75"
                    android:endColor="#a0ffcb00"
                    android:angle="270"
            />
        </shape>
    </clip>
</item>

<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners
                android:radius="5dip" />
            <gradient
                android:startColor="@color/progress_start"
                android:endColor="@color/progress_end"
                android:angle="270" 
            />
        </shape>
    </clip>
</item>

</layer-list>

Answer #6

Voici le code pour modifier la couleur de ProgressBar par programmation.

ProgressBar progressBar = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
progressBar.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));

Answer #7

Comment je l'ai fait dans ProgressBar horizontal:

    LayerDrawable layerDrawable = (LayerDrawable) progressBar.getProgressDrawable();
    Drawable progressDrawable = layerDrawable.findDrawableByLayerId(android.R.id.progress);
    progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);

Answer #8

De nos jours, en 2016, j'ai trouvé que certains dispositifs pré-Lollipop n'honorent pas le paramètre colorAccent , donc ma solution finale pour toutes les API est maintenant la suivante:

// fixes pre-Lollipop progressBar indeterminateDrawable tinting
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

    Drawable wrapDrawable = DrawableCompat.wrap(mProgressBar.getIndeterminateDrawable());
    DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
    mProgressBar.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
} else {
    mProgressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
}

Pour les points bonus, il n'utilise aucun code obsolète. Essayez-le!


Answer #9

Solution la plus simple si vous voulez changer la couleur dans le fichier XML de mise en page, utilisez le code ci-dessous et utilisez la propriété indeterminateTint pour la couleur désirée.

    <ProgressBar
      android:id="@+id/progressBar"
      style="?android:attr/progressBarStyle"
      android:layout_width="wrap_content"
      android:indeterminate="true"
      android:indeterminateTintMode="src_atop"
      android:indeterminateTint="#ddbd4e"
      android:layout_height="wrap_content"
      android:layout_marginBottom="20dp"
      android:layout_alignParentBottom="true"
      android:layout_centerHorizontal="true" />

Answer #10

Appliquez ce style personnalisé à la barre de progression.

<style name="customProgress" parent="@android:style/Widget.ProgressBar.Small">
        <item name="android:indeterminateDrawable">@drawable/progress</item>
        <item name="android:duration">40</item>
        <item name="android:animationCache">true</item>
        <item name="android:drawingCacheQuality">low</item>
        <item name="android:persistentDrawingCache">animation</item>
    </style>

@ drawable / progress.xml -

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/spinner_white"
    android:pivotX="50%"
    android:pivotY="50%" />

Utilisez ce type d'image pour la barre de progression.

Pour un meilleur résultat, vous pouvez utiliser plusieurs images de progression. Et n'hésitez pas à utiliser des images, car Android Platform utilise des images pour la barre de progression. Le code est extrait de sdk :)


Answer #11
android:progressTint="#ffffff" 

Answer #12

Cela a fonctionné pour moi:

<ProgressBar
 android:indeterminateTint="#d60909"
 ... />

Answer #13

Cette solution a fonctionné pour moi:

<style name="Progressbar.White" parent="AppTheme">
    <item name="colorControlActivated">@color/white</item>
</style>

<ProgressBar
    android:layout_width="@dimen/d_40"
    android:layout_height="@dimen/d_40"
    android:indeterminate="true"
    android:theme="@style/Progressbar.White"/>

Answer #14

Pour un ProgressBar horizontal, vous pouvez aussi utiliser un ColorFilter , comme ceci:

progressBar.getProgressDrawable().setColorFilter(
    Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);

Remarque: cela modifie l'apparence de toutes les barres de progression de votre application. Pour modifier uniquement une barre de progression spécifique, procédez comme suit:

Drawable progressDrawable = progressBar.getProgressDrawable().mutate();
progressDrawable.setColorFilter(Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);
progressBar.setProgressDrawable(progressDrawable);

Si progressBar est indéterminé, utilisez getIndeterminateDrawable() au lieu de getProgressDrawable() .

Depuis Lollipop (API 21), vous pouvez définir une teinte de progression:

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));


Answer #15

Utilisez le android.support.v4.graphics.drawable.DrawableCompat :

            Drawable progressDrawable = progressBar.getIndeterminateDrawable();
            if (progressDrawable  != null) {
                Drawable mutateDrawable = progressDrawable.mutate();
                DrawableCompat.setTint(mutateDrawable, primaryColor);
                progressBar.setProgressDrawable(mutateDrawable);
            }

Answer #16

Vous pouvez essayer de changer vos Styles, Thèmes, ou en utilisant android: indeterminateTint = "@ color / yourColor" où vous voulez, mais il y a juste une façon de faire qui fonctionnera sur n'importe quelle version Android SKD:

Si la barre de progression n'est pas indéterminée, veuillez utiliser:

progressBar.getProgressDrawable().setColorFilter(ContextCompat.getColor(context, R.color.yourColor), PorterDuff.Mode.SRC_IN );

Si la barre de progression est indéterminée, veuillez utiliser:

progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), R.color.yourColor), PorterDuff.Mode.SRC_IN );

C'est triste que Android est un tel gâchis!


Answer #17

Pour ma barre de progression indéterminée (spinner), je viens de définir un filtre de couleur sur le drawable. Fonctionne très bien et juste une ligne.

Exemple où mettre la couleur au rouge:

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

spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000, android.graphics.PorterDuff.Mode.MULTIPLY);


Answer #18

Selon Muhammad-adil suggéré pour SDK ver 21 et au-dessus

android:indeterminateTint="@color/orange"

en XML Works pour moi, c'est assez facile.


Answer #19

Selon certaines suggestions, vous pouvez spécifier une forme et clipdrawable avec une couleur, puis définissez-le. J'ai ce travail par programme. C'est comme ça que je le fais ..

Assurez-vous d'abord d'importer la bibliothèque pouvant être dessinée.

import android.graphics.drawable.*;

Ensuite, utilisez le code similaire à ci-dessous;

ProgressBar pg = (ProgressBar)row.findViewById(R.id.progress);
final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null,null));
String MyColor = "#FF00FF";
pgDrawable.getPaint().setColor(Color.parseColor(MyColor));
ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
pg.setProgressDrawable(progress);   
pg.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));
pg.setProgress(45);

Answer #20
ProgressBar bar;

private Handler progressBarHandler = new Handler();

GradientDrawable progressGradientDrawable = new GradientDrawable(
        GradientDrawable.Orientation.LEFT_RIGHT, new int[]{
                0xff1e90ff,0xff006ab6,0xff367ba8});
ClipDrawable progressClipDrawable = new ClipDrawable(
        progressGradientDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
Drawable[] progressDrawables = {
        new ColorDrawable(0xffffffff),
        progressClipDrawable, progressClipDrawable};
LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);


int status = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // TODO Auto-generated method stub
    setContentView(R.layout.startup);

    bar = (ProgressBar) findViewById(R.id.start_page_progressBar);
    bar.setProgress(0);
    bar.setMax(100);

    progressLayerDrawable.setId(0, android.R.id.background);
    progressLayerDrawable.setId(1, android.R.id.secondaryProgress);
    progressLayerDrawable.setId(2, android.R.id.progress);

    bar.setProgressDrawable(progressLayerDrawable);
}

Cela m'a aidé à définir une couleur personnalisée pour progresser dans le code. J'espère que cela aide


Answer #21

si indéterminé:

((ProgressBar)findViewById(R.id.progressBar))
    .getIndeterminateDrawable()
    .setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);

Answer #22

Barre de progression horizontale style de matériau personnalisé:

Pour changer la couleur du fond et la progression de la barre de progression horizontale.

<style name="MyProgressBar" parent="@style/Widget.AppCompat.ProgressBar.Horizontal">
    <item name="android:progressBackgroundTint">#69f0ae</item>
    <item name="android:progressTint">#b71c1c</item>
    <item name="android:minWidth">200dp</item>
</style>

Appliquez-le à la barre de progression en définissant l'attribut de style, pour les styles de matériaux personnalisés et la barre de progression personnalisée, cliquez sur http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples


Answer #23

Une autre petite chose, la solution de thème fonctionne si vous héritez d'un thème de base, donc pour l'application compacte votre thème devrait être:

<style name="AppTheme.Custom" parent="@style/Theme.AppCompat">
    <item name="colorAccent">@color/custom</item>
</style>

Et puis définissez ceci dans le thème de la barre de progression

<ProgressBar
    android:id="@+id/progressCircle_progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:theme="@style/AppTheme.Custom"
    android:indeterminate="true"/>




android-progressbar