Il y a 3 façons de résoudre cette question:
- Comment ajuster la couleur de la barre de progression de manière déclarative
- Comment ajuster la couleur de la barre de progression par programme, mais choisir la couleur parmi diverses couleurs prédéterminées déclarées avant la compilation
- 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 le voit dans les commentaires à la réponse de l'amfcosta. Cette réponse donnera des résultats de couleur imprévisibles chaque fois que vous souhaitez définir la barre de progression sur autre chose que les couleurs primaires, car elle ne modifie que la couleur d'arrière-plan, et la zone de «clip» de la barre de progression réelle sera toujours une superposition jaune avec une opacité réduite. Par exemple, l'utilisation de cette méthode pour définir l'arrière-plan en violet foncé entraînera une couleur de "clip" de la barre de progression d'une couleur rose folle résultant d'un mélange de violet foncé et de jaune via un alpha réduit.
Donc de toute façon, Ryan répond parfaitement au n ° 1 et Štarke répond à la plupart des n ° 3, mais pour ceux qui recherchent une solution complète aux n ° 2 et 3:
Comment ajuster la couleur de la barre de progression par programme, mais choisir 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 changez les couleurs dans my_progress et my_secondsProgress:
(REMARQUE: il ne s'agit que d'une copie du fichier XML réel définissant la barre de progression du SDK Android par défaut, mais j'ai changé les identifiants et les couleurs. L'original est nommé progress_horizontal)
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/my_progress_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="@+id/my_secondaryProgress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#80ff171d"
android:centerColor="#80ff1315"
android:centerY="0.75"
android:endColor="#a0ff0208"
android:angle="270"
/>
</shape>
</clip>
</item>
<item android:id="@+id/my_progress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#7d2afdff"
android:centerColor="#ff2afdff"
android:centerY="0.75"
android:endColor="#ff22b9ba"
android:angle="270"
/>
</shape>
</clip>
</item>
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 ajuster la couleur de la barre de progression par programme et créer également la couleur par programme
EDIT: j'ai trouvé le temps de résoudre ce problème correctement. Ma réponse précédente laissait cela un peu ambigu.
Un ProgressBar est composé de 3 Drawables dans un LayerDrawable.
- La couche 1 est l'arrière-plan
- La couche 2 est la couleur de progression secondaire
- La couche 3 est la principale couleur 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 attribue 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