web-dev-qa-db-fra.com

Comment modifier la couleur de progression de la barre de progression dans Android

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

413
WhiteTigerK

Je suis désolé que ce ne soit pas la solution, mais qu'est-ce qui pousse l'exigence à 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>
270
Alex Volovoy

Pour une barre de progression horizontale, vous pouvez également utiliser un ColorFilter, comme ceci:

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

Red ProgressBar using color filter

Remarque: Ceci modifie l'apparence de toutes les barres de progression dans votre application. Pour ne modifier qu'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));

Red ProgressBar using progress tint

454
Torben Kohlmeier

Ce n'est pas programmatique, mais je pense que cela pourrait aider beaucoup de gens de toute façon.
J'ai beaucoup essayé et le moyen le plus efficace consistait à ajouter ces lignes à mon ProgressBar dans le fichier .xml:

            Android:indeterminate="true"
            Android:indeterminateTintMode="src_atop"
            Android:indeterminateTint="@color/secondary"

Donc à la fin ce code l'a fait pour moi:

<ProgressBar
            Android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleLarge"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_centerHorizontal="true"
            Android:layout_centerVertical="true"
            Android:layout_marginTop="50dp"
            Android:layout_marginBottom="50dp"
            Android:visibility="visible"
            Android:indeterminate="true"
            Android:indeterminateTintMode="src_atop"
            Android:indeterminateTint="@color/secondary">

Cette solution fonctionne pour API 21 +

283
FFirmenich

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

Exemple où définir la couleur en rouge:

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

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

enter image description here

220
jhavatar

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

Changer colorAccent changera également la couleur de votre ProgressBar, mais ces changements se refléteront également à 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 à cette 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 ajoutez l'attribut Android:theme:

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

Cela ressemblera à quelque chose comme ç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" />

Donc, vous changez simplement un colorAccent pour votre ProgressBar particulier.

Remarque : L'utilisation de 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

167
kirtan403

Toutes les API

si vous utilisez toutes les API, créez simplement le thème avec style

style.xml

<resources>

    //...

    <style name="progressBarBlue" parent="@style/Theme.AppCompat">
        <item name="colorAccent">@color/blue</item>
    </style>

</resources>

et utilisation en cours

<ProgressBar
    ...
    Android:theme="@style/progressBarBlue" />

API de niveau 21 et supérieur

si utilisé dans les API de niveau 21 et supérieur, utilisez simplement ce code:

<ProgressBar
   //...
   Android:indeterminate="true"
   Android:indeterminateTintMode="src_atop"
   Android:indeterminateTint="@color/secondary"/>
37
Rasoul Miri

selon certaines des suggestions, vous POUVEZ spécifier une forme et un dessin pouvant être coupé avec une couleur, puis définissez-la. J'ai ce travail par programmation. Voici comment je le fais ..

Commencez par vous assurer que vous importez la bibliothèque extractible.

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

Cela a fonctionné pour moi:

<ProgressBar
 Android:indeterminateTint="#d60909"
 ... />
28
MOH3N

si indéterminé:

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

Aujourd'hui, en 2016, j'ai constaté que certains périphériques pré-Lollipop ne respectent pas le paramètre colorAccent. C'est pourquoi ma solution finale pour toutes les API est 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!

22
Henrique de Sousa

C'est ce que j'ai fait. Travaillé.

ProgressBar:

<ProgressBar
            Android:id="@+id/progressBar"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_weight="4"
            Android:indeterminateDrawable="@drawable/progressdrawable"
           />

progressdrawable.xml:
Utilisez ici un dégradé pour changer de couleur à votre guise. Et Android: toDegrees = "X" augmentent la valeur de X et progressbar tourne rapidement. Diminuez et faites pivoter lentement. Personnalisez selon vos besoins.

<?xml version="1.0" encoding="utf-8"?>
     <rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:duration="4000"
            Android:fromDegrees="0"
            Android:pivotX="50%"
            Android:pivotY="50%"
            Android:toDegrees="360" >

            <shape
                Android:innerRadius="20dp"
                Android:shape="ring"
                Android:thickness="4dp"
                Android:useLevel="false" >
                <size
                    Android:height="48dp"
                    Android:width="48dp" />

                <gradient
                    Android:centerColor="#80ec7e2a"
                    Android:centerY="0.5"
                    Android:endColor="#ffec7e2a"
                    Android:startColor="#00ec7e2a"
                    Android:type="sweep"
                    Android:useLevel="false" />
            </shape>

        </rotate>

exemple: enter image description here

19
Debasish Ghosh

Cliquez sur le même problème en modifiant l'apparence de la barre de progression par défaut. Voici quelques informations supplémentaires qui, espérons-le, aideront les gens :)

  • Le nom du fichier XML ne doit contenir que des caractères: a-z0-9_. (c'est-à-dire sans majuscule!)
  • Pour référencer votre "dessinable" c'est R.drawable.filename
  • Pour remplacer l'apparence par défaut, vous utilisez myProgressBar.setProgressDrawable(...). Toutefois, vous ne pouvez pas simplement vous référer à votre présentation personnalisée en tant que R.drawable.filename, vous devez le récupérer en tant que Drawable:
    Resources res = getResources();
    myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
    
  • Vous devez définir le style avant de définir Progress/Secondary Progress/Max (le régler ensuite pour moi a entraîné une barre de progression 'vide')
18
pyko

Il y a probablement une chose qui n'a pas été mentionnée dans cette réponse:

Si votre thème hérite de Theme.AppCompat, ProgressBar prendra la couleur que vous avez définie en tant que "colorAccent" dans votre thème.

Donc, en utilisant ..

<item name="colorAccent">@color/custom_color</item>

..will teindre la couleur de la barre de progression de manière automatique pour le @color/custom_color.

15
Henrique de Sousa

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);
14
mieszk3
Android:progressTint="#ffffff" 
13
padeg

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

Si votre 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 votre 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 soit un tel désordre!

13
Adriano Moutinho

La solution la plus simple si vous souhaitez modifier la couleur du fichier XML de mise en page, utilisez le code ci-dessous et utilisez la propriété indeterminateTint pour la couleur de votre choix.

    <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" />
12
Naveed Ahmad

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"/>
11
S.Javed

Encore une petite chose, la solution de thème fonctionne si vous héritez d'un thème de base. Par conséquent, votre thème doit être le suivant:

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

Et ensuite définir 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"/>
7
Calin

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


Je peux dire qu’il existe (ou du moins, au moment de la rédaction de ce document lorsque j’ai examiné la version actuelle de Android le code source) un bug/un problème/une optimisation dans le code ProgressBar ignore une tentative de définir la progression sur une valeur à laquelle elle se trouve déjà.

  • c'est-à-dire si progress = 45 et que vous essayez de le définir sur 45, le code ne fera rien et ne redessinera pas la progression .

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

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 définir sur 0, puis sur la valeur "ancienne", et la barre sera redessinée.


Donc, pour résumer:

  • conserver la "vieille" valeur de progression
  • mettre à jour le dessin/couleur (barre vide)
  • réinitialiser la progression à 0 (sinon la ligne suivante ne fait rien)
  • réinitialiser la progression à la valeur "ancienne" (barre de corrections)
  • invalider

Ci-dessous une méthode que j'ai qui fait ceci:

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 qu’il s’agissait d’une solution de contournement similaire, consistant à définir manuellement le décalage de "progression". Dans les deux cas, le code ci-dessus devrait fonctionner pour vous.

6

Voici le code pour changer la couleur de ProgressBar par programme.

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

Pour un ProgressBar de style 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", définissez simplement valeur2 sur valeur1.

4
Keith

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);
            }
4
Alécio Carvalho

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. enter image description here

Pour de meilleurs résultats, vous pouvez utiliser plusieurs images de progression. Et n'hésitez pas à utiliser des images, car Android Platform lui-même utilise des images pour progressbar. Le code est extrait de sdk :)

4
Neo

Pour changer la couleur horizontale de ProgressBar (en kotlin):

fun tintHorizontalProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        progress.progressTintList = ColorStateList.valueOf(color)
    } else{
        val layerDrawable = progress.progressDrawable as? LayerDrawable
        val progressDrawable = layerDrawable?.findDrawableByLayerId(Android.R.id.progress)
        progressDrawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    }
}

Pour modifier la couleur ProgressBar indéterminée:

fun tintIndeterminateProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        progress.indeterminateTintList = ColorStateList.valueOf(color)
    } else {
        (progress.indeterminateDrawable as? LayerDrawable)?.apply {
            if (numberOfLayers >= 2) {
                setId(0, Android.R.id.progress)
                setId(1, Android.R.id.secondaryProgress)
                val progressDrawable = findDrawableByLayerId(Android.R.id.progress).mutate()
                progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
            }
        }
    }
}

Et finalement, il teint normalement les barres de progression pré-sucettes

tinted progress on api 19

3
John

C'est si simple d'utiliser attr, si vous utilisez des applications multi-styles:

essayez de cette façon:

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

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

Coller ci-dessous 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"/>
3
DeepakPanwar

Style de matériau personnalisé de la barre de progression horizontale:

Pour changer la couleur de 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ériau personnalisés et la vérification de la barre de progression personnalisée http://www.zoftino.com/Android-progressbar-and-custom-progressbar-examples

3
Arnav Rao

Selon muhammad-adil suggéré pour SDK versions 21 et supérieures

Android:indeterminateTint="@color/orange"

dans XML Works pour moi, c'est assez simple.

3
mughil
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 progressbar dans le code. J'espère que ça aide

3
SKT
ProgressBar freeRamPb = findViewById(R.id.free_ram_progress_bar);

freeRamPb.getProgressDrawable().setColorFilter(
Color.BLUE, Android.graphics.PorterDuff.Mode.SRC_IN);

Horizontal ProgressBar utilise rectangle shape dessinable pour l'arrière-plan, ClipDrawable construit à partir de rectangle shape pour les progrès (primaire et secondaire). La teinte change les couleurs en une teinte. Si vous voulez 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. Premier dessinable devrait être pour le fond. Selon mon expérience, changer d'identifiant ne fonctionne pas. Si vous définissez padding sur progressbar, cette approche ne fonctionnera pas. Si vous avez besoin de remplissage, vous pouvez utiliser un conteneur pour la barre de progression, tel que LinearLayout.

2
Birendra Singh

simplement utiliser:

PorterDuff.Mode mode = PorterDuff.Mode.SRC_IN;
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Gingerbread_MR1) {
    mode = PorterDuff.Mode.MULTIPLY;
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
    progressBar.setProgressBackgroundTintList(ColorStateList.valueOf(Color.RED));
} else {
    Drawable progressDrawable;
    progressDrawable = (progressBar.isIndeterminate() ? progressBar.getIndeterminateDrawable() : progressBar.getProgressDrawable()).mutate();
    progressDrawable.setColorFilter(context.getResources().getColor(Color.RED), mode);
    progressBar.setProgressDrawable(progressDrawable);
}
0
Mohammad Fneish