Esistono 3 modi per risolvere questa domanda:
- Come regolare il colore della barra di avanzamento in modo dichiarativo
- Come regolare il colore della barra di avanzamento a livello di codice, ma scegliere il colore tra vari colori predeterminati dichiarati prima del tempo di compilazione
- Come regolare il colore della barra di avanzamento a livello di codice e anche creare il colore a livello di codice.
In particolare c'è molta confusione tra # 2 e # 3, come si vede nei commenti alla risposta di amfcosta. Quella risposta produrrà risultati di colore imprevedibili ogni volta che desideri impostare la barra di avanzamento su qualsiasi cosa tranne i colori primari, poiché modifica solo il colore di sfondo e l'area della "clip" della barra di avanzamento effettiva sarà comunque una sovrapposizione gialla con opacità ridotta. Ad esempio, l'utilizzo di questo metodo per impostare lo sfondo su viola scuro provocherà un colore "clip" della barra di avanzamento di un pazzo colore rosato risultante dalla miscelazione di viola scuro e giallo tramite alfa ridotta.
Quindi, comunque, il numero 1 riceve una risposta perfetta da Ryan e Štarke risponde alla maggior parte del numero 3, ma per coloro che cercano una soluzione completa per i numeri 2 e 3:
Come regolare il colore della barra di avanzamento a livello di codice, ma scegliere il colore da un colore predeterminato dichiarato in XML
res / drawable / my_progressbar.xml :
Crea questo file ma modifica i colori in my_progress e my_secondsProgress:
(NOTA: questa è solo una copia del file XML effettivo che definisce ProgressBar dell'SDK Android predefinito, ma ho cambiato ID e colori. L'originale si chiama 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>
Nel tuo 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)
Come regolare il colore della barra di avanzamento a livello di codice e anche creare il colore a livello di codice
MODIFICARE: ho trovato il tempo per risolverlo correttamente. La mia precedente risposta ha lasciato questo un po 'ambiguo.
Un ProgressBar è composto da 3 Drawable in un LayerDrawable.
- Il livello 1 è lo sfondo
- Il livello 2 è il colore di avanzamento secondario
- Il livello 3 è il colore principale della barra di avanzamento
Nell'esempio seguente cambierò il colore della barra di avanzamento principale in ciano.
//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);
Quell'esempio lo ha impostato su un colore solido. È possibile impostarlo su un colore sfumato sostituendolo
shpDrawable.getPaint().setColor(Color.CYAN);
con
Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
shpDrawable.getPaint().setShader(shader);
Saluti.
-Lancia