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

WhiteTigerK
la source
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>
Alex Volovoy
la source
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

Torben Kohlmeier
la source
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+

FFirmenich
la source
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

jhavatar
la source
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

kirtan403
la source
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"/>
Rasoul Miri
la source
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);
PaulieG
la source
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
@ateiob J'ai écrit une nouvelle réponse pour expliquer ...
Richard Le Mesurier
32

Cela a fonctionné pour moi:

<ProgressBar
 android:indeterminateTint="#d60909"
 ... />
MOH3N
la source
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);
le couteau
la source
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"
   />
Devinder Jhinjer
la source
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!

Henrique de Sousa
la source
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

Debasish Ghosh
la source
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 '')
pyko
la source
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.

Henrique de Sousa
la source
1
Je devais utiliser <item name = "android: colorAccent"> @ color / highlight </item>
tonisives
15
android:progressTint="#ffffff" 
Paul
la source
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!

Adriano Moutinho
la source
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);
mieszk3
la source
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" />
Naveed Ahmad
la source
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"/>
S.Javed
la source
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"/>
Calin
la source
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

John
la source
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

Arnav Rao
la source
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.

Richard Le Mesurier
la source
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 android.support.v4.graphics.drawable.DrawableCompat :

            Drawable progressDrawable = progressBar.getIndeterminateDrawable();
            if (progressDrawable  != null) {
                Drawable mutateDrawable = progressDrawable.mutate();
                DrawableCompat.setTint(mutateDrawable, primaryColor);
                progressBar.setProgressDrawable(mutateDrawable);
            }
Alécio Carvalho
la source
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);
}
Mohammad Fneish
la source
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.

Keith
la source
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 :)

Néo
la source
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.

mughil
la source
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));
Naveen Kumar M
la source
4
ProgressBar freeRamPb = findViewById(R.id.free_ram_progress_bar);

freeRamPb.getProgressDrawable().setColorFilter(
Color.BLUE, android.graphics.PorterDuff.Mode.SRC_IN);
Exception de pointeur nul
la source
Impressionnant. Solution rapide et efficace. Merci!
Tobias Reich