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)?
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>
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);
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));
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 +
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);
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
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"/>
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);
Cela a fonctionné pour moi:
<ProgressBar
Android:indeterminateTint="#d60909"
... />
si indéterminé:
((ProgressBar)findViewById(R.id.progressBar))
.getIndeterminateDrawable()
.setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
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!
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>
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 :)
a-z0-9_.
(c'est-à-dire sans majuscule!)R.drawable.filename
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);
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
.
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);
Android:progressTint="#ffffff"
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!
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" />
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"/>
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"/>
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à.
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:
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.
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));
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.
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);
}
Appliquez ce style personnalisé à la barre de progression.
<style name="customProgress" parent="@Android:style/Widget.ProgressBar.Small">
<item name="Android:indeterminateDrawable">@drawable/progress</item>
<item name="Android:duration">40</item>
<item name="Android:animationCache">true</item>
<item name="Android:drawingCacheQuality">low</item>
<item name="Android:persistentDrawingCache">animation</item>
</style>
@ drawable/progress.xml -
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:drawable="@drawable/spinner_white"
Android:pivotX="50%"
Android:pivotY="50%" />
Utilisez ce type d'image pour la barre de progression.
Pour 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 :)
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
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"/>
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
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.
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
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
.
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);
}