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


474

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


Avez-vous essayé MyProgressBar.setProgressDrawable (Drawable d) en spécifiant un bitmap avec la couleur que vous souhaitez? developer.android.com/reference/android/widget/… developer.android.com/reference/android/graphics/drawable/…
fupsduck

2
Oui je l'ai essayé mais ça ne marche pas. Il définit la couleur d'arrière-plan de l'ensemble de la vue de la barre de progression au lieu de définir la couleur d'arrière-plan de la barre elle-même uniquement. Merci.
WhiteTigerK

21
android:indeterminateTint="@android:color/white"fonctionne uniquement sur API> = 21
Madeyedexter

Réponses:


291

Je suis désolé que ce ne soit pas la réponse, mais qu'est-ce qui explique l'exigence de le définir à partir du code? Et .setProgressDrawabledevrait 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>

4
La raison en est que je crée la barre de progression de manière dynamique et que je définis sa couleur à la demande de l'utilisateur. Étant donné que j'utilise habituellement du code pour créer mon écran GUI et mes composants, je ne connais pas le XML joint et je ne sais pas ce qu'est une liste de couches (bien que je suppose que vous construisez la barre de progression en fonction de plusieurs couches ..). Dans le cas où je souhaite utiliser le XML que vous avez joint - où dois-je le placer dans le dossier du projet et y a-t-il autre chose à faire pour créer une barre de progression basée sur les paramètres XML? Merci.
WhiteTigerK

1
Vous enregistrez ce fichier XML en tant que fichier et le placez dans le dossier dessinable (disons my_progress.xml) que vous le définissez comme dessinable dans MyProgressBar.setProgressDrawable () Pour changer les couleurs - vous devrez modifier ces valeurs dans @ color / progress_start @ color / progress_end C'est essentiellement un dégradé et vous pouvez y mettre de l'hex.
Alex Volovoy

3
Remarque - le fichier est la copie de celui qui est dans le SDK. J'ai abandonné le droit d'auteur ici. Si vous regardez dans le dossier res / drawable, vous verrez exactement ce que j'ai publié - les couleurs sont définies sur le dégradé jaune, au lieu des couleurs personnalisées.
Alex Volovoy

7
Cela ne montre aucun changement de couleur pour moi. veuillez indiquer la couleur qui a fonctionné.
Praveen

Salut Alex, tes réponses sont très agréables. mais j'ai essayé de changer la couleur de la roue de progression personnalisée au moment de l'exécution. Mais je ne pouvais pas. s'il vous plaît, aidez-moi à résoudre mon problème .. une fois que la progression atteint 100%, alors changez la couleur et commencez la progression ..
je

485

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

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

ProgressBar rouge utilisant un filtre de couleur

Remarque: cela modifie l'apparence de toutes les barres de progression dans 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-le à la getIndeterminateDrawable()place de getProgressDrawable().

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

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

ProgressBar rouge utilisant la teinte de progression


7
Je voulais utiliser cette réponse car elle me semblait être la plus simple mais ma barre de progression est complètement rouge indépendamment de la valeur de progression. Êtes-vous sûr du mode à utiliser?
LG

33
@resus J'ai le même problème, la barre était entièrement rouge et aucune progression n'était visible. Mais je l'ai résolu en changeant Mode.SRC_IN en Mode.MULTIPLY.
Derzu

40
N'oubliez pas de faire de même getIndeterminateDrawablesi vous utilisez des progrès indéterminés.
Thommy

6
Soyez avisé, «Mode» dans ce contexte se réfère à android.graphics.PorterDuff.Mode
1owk3y

9
comment ne pas changer la couleur de fond? Je veux juste changer la couleur de la progression.
kangear

364

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 était d'ajouter ces lignes à ma barre de progression 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+


45
Nécessite un niveau d'API minimum 21
Apfelsaft

Il existe également des méthodes de définition pour ces propriétés qui peuvent être appelées si la couleur dynamique doit être définie.
racs

Dois-je créer un fichier de ressources personnalisé pour api 21+ et api <= 20? Ou ces attributs sont-ils simplement ignorés dans api <= 20?
prom85

1
@shriduttkothari comment peut-il être le meilleur? ... à partir de 21+
user25

2
La meilleure réponse alors qu'Android s'éloigne du 4.x minimum
Tom

229

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 une seule ligne.

Exemple où définir la couleur sur le rouge:

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

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

entrez la description de l'image ici


16
J'aime mieux ta réponse. Pour que le mien fonctionne, je devais le faire: myProgressBarSpinner.getIndeterminateDrawable (). SetColorFilter (new LightingColorFilter (0xFF000000, foregroundColorDesired));
Art Geigel

4
Notez également que cela modifiera les tirages de TOUTES les barres de progression dans votre application. Pour faire cela uniquement à un particulier, appelez mutate () sur drawable, puis définissez un filtre de couleur dessus, puis appelez setIntederminateDrawable sur votre progressBar.
dimsuz

3
NB: Ceux qui l'utilisent et se demandent pourquoi leur couleur ne ressemble pas exactement à la chaîne hexadécimale qu'ils ont mise, il y a un filtre multicolore. Changez android.graphics.PorterDuff.Mode.MULTIPLYpour PorterDuff.Mode.SRC_INet vous obtiendrez la couleur hexadécimale exacte.
micnguyen

Je pense qu'il a juste besoin de cette réponse ..... android: indeterminateTint = "@ android: color / black"
Muhammad Adil

4
j'ai utilisé comme: progressBar = (ProgressBar) findViewById (R.id.progressBar); progressBar.getIndeterminateDrawable (). setColorFilter (ContextCompat.getColor (this, android.R.color.white), android.graphics.PorterDuff.Mode.MULTIPLY);
ashishdhiman2007

189

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, votre ProgressBarcouleur sera celle que colorAccentvous aurez définie.

Changer colorAccentchangera également ProgressBarla couleur de votre, mais les changements se reflètent également à plusieurs endroits. Donc, si vous voulez une couleur différente juste pour un spécifique, PregressBarvous pouvez le faire en appliquant un thème à cela 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 en ProgressBarajoutant l' android:themeattribut:

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

Cela ressemblera donc à ceci:

<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 colorAccentpour votre particulier ProgressBar.

Remarque : L'utilisation stylene fonctionnera pas. Vous devez utiliser android:themeuniquement. Vous pouvez trouver plus d'utilisation du thème ici: https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH


18
enfin! merci, il semble que peu de développeurs utilisent AppCompat, de nombreux utilisateurs votent simplement les réponses avec la solution pour API 21+, pas bon du tout, ils devraient prendre en charge plus d'appareils / OS que possible
user25

1
Impressionnant! Cela a fonctionné pour moi, mais je devais m'assurer qu'il y avait un parent = "@ style / Theme.AppCompat" quelque part dans la hiérarchie des styles, j'avais un autre parent et cela n'a pas fonctionné au début.
Nublodeveloper

@Nublodeveloper Oui, je l'ai mentionné dans la première ligne si vous l'avez remarqué.
kirtan403

1
@ kirtan403 Ah, oui, je comprends maintenant que vous le mentionnez, mais je ne l'ai pas compris de cette façon lorsque je l'ai lu pour la première fois. Je l'ai lu trop vite et je cherchais du code. Merci quand même, votre réponse est la meilleure pour moi!
Nublodeveloper

+1 A aimé votre solution. Mais comment définir la couleur du thème en java ??? Par exemple, si je veux qu'il soit rouge <color name = "red"> # ff5900 </color>
Maseed

54

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 niveau 21 et supérieur

s'il est utilisé dans l'API niveau 21 et supérieur, utilisez simplement ce code:

<ProgressBar
   //...
   android:indeterminate="true"
   android:indeterminateTintMode="src_atop"
   android:indeterminateTint="@color/secondary"/>

1
Nice, je pense que la méthode style.xml est la meilleure. (Pas besoin de plus de 20 api)
iamkdblue

1
Meilleure solution si vous voulez une solution pour toutes les API Merci :)
Naveen

34

selon certaines suggestions, vous POUVEZ spécifier une forme et un clip détachable avec une couleur, puis définissez-le. J'ai ce travail par programme. Voilà comment je le fais ..

Assurez-vous d'abord d'importer la bibliothèque dessinable.

import android.graphics.drawable.*;

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

1
J'ai essayé le code ci-dessus, malheureusement il se traduit simplement par une barre de progression "vide". Suis-je en train de manquer quelque chose?
OceanBlue

Vous devez appeler setLevel sur le ClipDrawable. Il prend une valeur de 0 à 10000. Ainsi, progress.setLevel (2500) serait rempli à 25%.
HappyEngineer

1
J'ai soumis une modification à la réponse qui explique une raison pour une barre de progression "vide" - et 2 façons de la corriger (y compris le correctif @ HappyEngineer)
Richard Le Mesurier

@RichardLeMesurier pouvez-vous poster l'explication + 2 façons dans la section commentaire? progress.setLevel(2500)ne fonctionne pas pour moi et apparemment, votre modification n'a pas été acceptée pour une raison quelconque. Merci. +1.
ateiob


32

Cela a fonctionné pour moi:

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

12
Uniquement utilisé dans l'API niveau 21 et supérieur
Numair

28

si indéterminé:

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

J'ai utilisé cela, mais ça n'anime pas, juste la couleur a été appliquée ... J'utilise la
barre de

24

Cela fonctionne pour moi. Cela fonctionne également pour la version inférieure. Ajoutez ceci à votre syles.xml

<style name="ProgressBarTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorAccent">@color/colorPrimary</item>
</style>

Et utilisez-le comme ça en xml

<ProgressBar
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:theme="@style/ProgressBarTheme"
   />

J'ai implémenté cela dans l' exemple d'application CryptoTweets . J'ai trouvé que le thème parent n'est pas requis pour que cette solution fonctionne comme prévu. parent="ThemeOverlay.AppCompat.Light"
Adam Hurwitz

23

De nos jours en 2016, j'ai trouvé que certains appareils pré-Lollipop n'honorent pas le colorAccentparamètre, 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!


N'oubliez pas d'appeler wrapDrawable.mutate()avecDrawableCompat.setTint(wrapDrawable.mutate(), ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
Tarsem Singh

Ne fonctionne pas sur Android KitKat 4.4.2.
pradip tilala

Je viens de l'essayer (à nouveau) sur un nouvel émulateur 4.4.2 et cela fonctionne sans aucun problème, vérifiez vos .xmlparamètres et si quelque chose d'autre remplace la ProgressBarcouleur.
Henrique de Sousa

20

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

Barre de progression:

<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 le dégradé pour changer la couleur comme vous le souhaitez. Et Android: toDegrees = "X" augmente la valeur de X et la barre de progression tourne rapidement. Diminuez et il tourne 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>

échantillon: entrez la description de l'image ici


Cela montre une animation (différente) totalement différente de celle par défaut.
Ixx

18

Frappez le même problème tout en travaillant sur la modification de 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 pas de majuscules!)
  • Pour référencer votre "dessinable", il est R.drawable.filename
  • Pour remplacer l'apparence par défaut, vous utilisez myProgressBar.setProgressDrawable(...), mais vous ne pouvez pas simplement vous référer à votre disposition personnalisée R.drawable.filename, vous devez la 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 la progression / la progression secondaire / max (le définir ensuite pour moi a entraîné une barre de progression `` vide '')

15

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, ProgressBarprendra la couleur que vous avez définie comme "colorAccent"dans votre thème.

Donc, en utilisant ..

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

..will teintera automatiquement la couleur de la ProgressBar @color/custom_color.


1
Je devais utiliser <item name = "android: colorAccent"> @ color / highlight </item>
tonisives


15

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 le faire qui fonctionnera sur n'importe quelle version d'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 qu'Android soit un tel gâchis!


Merci! Cela fonctionne pour indéterminé ProgressBar, mais pour déterminé, il peint toute l'échelle avec de la couleur.
CoolMind

14

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

2
J'ai fait la même chose, plus le changement de couleur d'arrière-plan: layerDrawable.findDrawableByLayerId (android.R.id.background) .setColorFilter (trackColor, PorterDuff.Mode.SRC);
Kamen Dobrev

1
Cette réponse avec le commentaire de @KamenDobrev est la seule à avoir fait ce que je voulais. Lorsque je ne mets qu'un filtre de couleur sur le dessin progressif, la couleur d'arrière-plan a également changé.
m_katsifarakis

13

Solution la plus simple si vous souhaitez modifier la couleur dans le fichier xml de mise en page, utilisez le code ci-dessous et utilisez la propriété indeterminateTint pour la couleur souhaité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" />

12

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"/>

8

Encore une petite chose, la solution de thème fonctionne si vous héritez d'un thème de base, donc pour une 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 cela 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

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 de la barre de progression 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 il teinte enfin normalement la progression pré-sucette

progrès teinté sur api 19


6

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

Pour changer la couleur de l'arrière-plan 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, consultez http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples


3
cela nécessite un niveau d'api minimum 21
Shihab Uddin

6

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


Je peux dire qu'il y a (ou du moins, au moment de la rédaction de ce document lorsque j'ai regardé la version actuelle du code source Android) un bogue / problème / optimisation dans le ProgressBarcode qui ignore une tentative de définir la progression sur une valeur qu'il est déjà à.

  • c'est-à-dire que si progress = 45, et que vous essayez de le régler à 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 pouvant être dessinée).

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:

  • conserver "l'ancienne" valeur de progression
  • mettre à jour le dessin / couleur (rend la barre vide)
  • remettre 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:

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 HappyEngineer, je pense que c'était une solution de contournement similaire, pour définir manuellement le décalage de "progression". Dans les deux cas, le code ci-dessus devrait fonctionner pour vous.


Merci ... cela fonctionne en effet ... mais comme mon dessinable était statique (à partir des ressources) ... cela n'a pas fonctionné. Cela n'a fonctionné qu'après avoir ajouté "drawable.invalidateSelf ();" avant les 'setProgress (0)' et 'setProgressDrawable (drawable)'
Alécio Carvalho


5

utilisez simplement:

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

4

Pour une 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 value2 sur value1.


4

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. entrez la description de l'image ici

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


4

Selon muhammad-adil suggéré pour SDK ver 21 et supérieur

android:indeterminateTint="@color/orange"

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


Si vous souhaitez modifier l'ensemble de l'application, veuillez modifier la valeur de <color name = "RedAccent"> # FE6C27 </color>. dans vos valeurs / colors.xml.
mughil

4

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

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

4
ProgressBar freeRamPb = findViewById(R.id.free_ram_progress_bar);

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

Impressionnant. Solution rapide et efficace. Merci!
Tobias Reich
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.