Android changer la couleur de la barre de progression horizontale

J’ai défini la barre de progression horizontale.

Je voudrais changer la couleur de progression du jaune.

 

Le problème est que la couleur de progression est différente selon les appareils. Donc, je veux qu’il corrige la couleur de progression.

Je l’ai copié depuis l’une de mes applications, il y a donc quelques atsortingbuts supplémentaires, mais vous devriez en avoir l’idée. Cela provient de la mise en page qui a la barre de progression:

  

Créez ensuite un nouveau dessin avec quelque chose de similaire à ce qui suit (dans ce cas, greenprogress.xml):

                          

Vous pouvez changer les couleurs si nécessaire, cela vous donnera une barre de progression verte.

Une solution plus simple:

progess_drawable_blue

                

Si vous souhaitez uniquement modifier la couleur de la barre de progression, vous pouvez simplement utiliser un filtre de couleur dans la méthode onCreate () de votre activité:

 ProgressBar progressbar = (ProgressBar) findViewById(R.id.progressbar); int color = 0xFF00FF00; progressbar.getIndeterminateDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN); progressbar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN); 

Idée d’ ici .

Il vous suffit de le faire pour les versions pré-sucette. Sur Lollipop, vous pouvez utiliser l’atsortingbut de style colorAccent.

Créez simplement un style dans values/styles.xml .

  

Ensuite, définissez ce style comme thème ProgressBar .

  

et peu importe que votre barre de progression soit horizontale ou circulaire. C’est tout.

pour API niveau 21 ou supérieur, utilisez simplement

 android:progressBackgroundTint="@color/yourBackgroundColor" android:progressTint="@color/yourColor" 

Il y a 3 façons de résoudre cette question:

  1. Comment régler la couleur de la barre de progression de manière déclarative
  2. Comment régler la couleur de la barre de progression par programmation, mais choisissez la couleur parmi les différentes couleurs prédéterminées déclarées avant la compilation
  3. Comment ajuster la couleur de la barre de progression par programme et créer également la couleur par programme.

En particulier, il y a beaucoup de confusion autour des # 2 et # 3, comme on peut le voir dans les commentaires sur la réponse d’Amfcosta. Cette réponse donnera des résultats de couleur imprévisibles chaque fois que vous voudrez définir la barre de progression sur tout sauf les couleurs primaires, car elle ne modifie que la couleur d’arrière-plan et la zone de clip de la barre de progression sera toujours une superposition jaune avec une opacité réduite. Par exemple, si vous utilisez cette méthode pour définir l’arrière-plan sur violet foncé, vous obtiendrez une barre de progression de la couleur «clip» d’une couleur rosâtre délirante résultant du mélange de violet foncé et de jaune via un alpha réduit.

De toute façon, Ryan et Štarke répondent parfaitement à la première question, mais pour ceux qui recherchent une solution complète à # 2 et # 3:


Comment ajuster la couleur de la barre de progression par programmation, mais choisissez la couleur à partir d’une couleur prédéterminée déclarée en XML

res / drawable / my_progressbar.xml :

Créez ce fichier mais modifiez les couleurs dans my_progress et my_secondsProgress:

(NOTE: Ceci est juste une copie du fichier XML réel définissant le ProgressBar SDK Android par défaut, mais j’ai changé les ID et les Couleurs. L’original est nommé progress_horizontal)

                         

Dans votre Java :

 final Drawable drawable; int sdk = android.os.Build.VERSION.SDK_INT; if(sdk < 16) { drawable = ctx.getResources().getDrawable(R.drawable.my_progressbar); } else { drawable = ContextCompat.getDrawable(ctx, R.drawable.my_progressbar); } progressBar.setProgressDrawable(drawable) 

Comment régler la couleur de la barre de progression par programmation et créer la couleur par programmation

EDIT: J'ai trouvé le temps de résoudre cela correctement. Mon ancienne réponse a laissé cela un peu ambigu.

Un ProgressBar est composé de 3 Drawables dans un LayerDrawable.

  1. La couche 1 est l'arrière-plan
  2. La couche 2 est la couleur de progression secondaire
  3. La couche 3 est la couleur principale de la barre de progression

Dans l'exemple ci-dessous, je changerai la couleur de la barre de progression principale en cyan.

 //Create new ClipDrawable to replace the old one float pxCornerRadius = viewUtils.convertDpToPixel(5); final float[] roundedCorners = new float[] { pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius }; ShapeDrawable shpDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null, null)); shpDrawable.getPaint().setColor(Color.CYAN); final ClipDrawable newProgressClip = new ClipDrawable(shpDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL); //Replace the existing ClipDrawable with this new one final LayerDrawable layers = (LayerDrawable) progressBar.getProgressDrawable(); layers.setDrawableByLayerId(R.id.my_progress, newProgressClip); 

Cet exemple lui donne une couleur unie. Vous pouvez le définir sur une couleur dégradée en remplaçant

 shpDrawable.getPaint().setColor(Color.CYAN); 

avec

 Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP); shpDrawable.getPaint().setShader(shader); 

À votre santé.

-Lance

La solution la plus simple que j’ai trouvée est la suivante:

 @color/white_or_any_color 

Placez le fichier ci-dessus dans le fichier styles.xml sous le dossier res > values .

REMARQUE: Si vous utilisez une autre couleur d’accent, les solutions précédentes doivent être compatibles.

API 21 ou supérieure

Pour ceux qui cherchent comment le faire par programmation:

  Drawable bckgrndDr = new ColorDrawable(Color.RED); Drawable secProgressDr = new ColorDrawable(Color.GRAY); Drawable progressDr = new ScaleDrawable(new ColorDrawable(Color.BLUE), Gravity.LEFT, 1, -1); LayerDrawable resultDr = new LayerDrawable(new Drawable[] { bckgrndDr, secProgressDr, progressDr }); //setting ids is important resultDr.setId(0, android.R.id.background); resultDr.setId(1, android.R.id.secondaryProgress); resultDr.setId(2, android.R.id.progress); 

Il est crucial de définir des identifiants sur les tableaux à dessin et de préserver les limites et l’état actuel de la barre de progression.

La couleur ProgressBar peut être modifiée comme suit:

/res/values/colors.xml

   #FF4081  

/res/values/styles.xml

  

onCreate:

 progressBar = (ProgressBar) findViewById(R.id.progressBar); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { Drawable drawable = progressBar.getIndeterminateDrawable().mutate(); drawable.setColorFilter(ContextCompat.getColor(this, R.color.colorAccent), PorterDuff.Mode.SRC_IN); progressBar.setIndeterminateDrawable(drawable); } 

final LayerDrawable layers = (LayerDrawable) progressBar.getProgressDrawable (); layers.getDrawable (2) .setColorFilter (color, PorterDuff.Mode.SRC_IN);

Vous me donnez vraiment mal à la tête. Ce que vous pouvez faire est de rendre votre liste de calques possible via xml (signifiant un arrière-plan en tant que premier calque, un dessin représentant la progression secondaire en tant que deuxième calque et un autre dessin représentant la progression principale en tant que dernier calque), puis modifiez la couleur du code en procédant comme suit:

 public void setPrimaryProgressColor(int colorInstance) { if (progressBar.getProgressDrawable() instanceof LayerDrawable) { Log.d(mLogTag, "Drawable is a layer drawable"); LayerDrawable layered = (LayerDrawable) progressBar.getProgressDrawable(); Drawable circleDrawableExample = layered.getDrawable(); circleDrawableExample.setColorFilter(colorInstance, PorterDuff.Mode.SRC_IN); progressBar.setProgressDrawable(layered); } else { Log.d(mLogTag, "Fallback in case it's not a LayerDrawable"); progressBar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN); } } 

Cette méthode vous donnera la meilleure flexibilité pour que la mesure de votre dessin original soit déclarée sur le xml, SANS MODIFICATION DE SA STRUCTURE APRÈS AVANT, en particulier si vous avez besoin du dossier d’écran du fichier xml spécifique, en modifiant simplement SEULEMENT LA COULEUR via le code. Pas de ré-instancier une nouvelle ShapeDrawable à partir de rien.

Les réponses ci-dessus modifient la couleur d’arrière-plan dans son intégralité et il est évident que cela modifie la hauteur de la barre de progression de manière à ce qu’elle ne puisse pas changer en xml. Il est préférable de ne modifier que le statut de la barre de progression: la couleur rouge à 20%, la couleur jaune à 50% à 70% et la couleur verte au-dessus. vous pouvez le faire par programmation en Java.

partagez votre réponse si vous avez une autre solution.