Es gibt drei Möglichkeiten, um diese Frage zu lösen:
- So passen Sie die Farbe des Fortschrittsbalkens deklarativ an
- So passen Sie die Farbe des Fortschrittsbalkens programmgesteuert an, wählen Sie jedoch die Farbe aus verschiedenen vor der Kompilierungszeit deklarierten Farben aus
- So passen Sie die Farbe des Fortschrittsbalkens programmgesteuert an und erstellen die Farbe programmgesteuert.
Insbesondere bei # 2 und # 3 herrscht große Verwirrung, wie aus den Kommentaren zu amfcostas Antwort hervorgeht. Diese Antwort führt zu unvorhersehbaren Farbergebnissen, wenn Sie den Fortschrittsbalken auf etwas anderes als Primärfarben setzen möchten, da nur die Hintergrundfarbe geändert wird und der tatsächliche "Clip" -Bereich des Fortschrittsbalkens weiterhin eine gelbe Überlagerung mit reduzierter Deckkraft ist. Wenn Sie beispielsweise diese Methode verwenden, um den Hintergrund auf dunkelviolett einzustellen, wird eine Fortschrittsbalken-Clip-Farbe mit einer verrückten rosa Farbe angezeigt, die sich aus der Vermischung von dunkelviolett und gelb über reduziertes Alpha ergibt.
Wie auch immer, # 1 wird perfekt von Ryan beantwortet und Štarke beantwortet die meisten von # 3, aber für diejenigen, die nach einer vollständigen Lösung für # 2 und # 3 suchen:
So passen Sie die Farbe des Fortschrittsbalkens programmgesteuert an, wählen jedoch die Farbe aus einer in XML deklarierten vorgegebenen Farbe aus
res / drawable / my_progressbar.xml :
Erstellen Sie diese Datei, aber ändern Sie die Farben in my_progress und my_secondsProgress:
(HINWEIS: Dies ist nur eine Kopie der eigentlichen XML-Datei, die die standardmäßige Android SDK ProgressBar definiert, aber ich habe die IDs und Farben geändert. Das Original heißt 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>
In Ihrem 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)
So passen Sie die Farbe des Fortschrittsbalkens programmgesteuert an und erstellen die Farbe programmgesteuert
EDIT: Ich habe die Zeit gefunden, dies richtig zu lösen. Meine frühere Antwort ließ dies etwas mehrdeutig.
Eine ProgressBar besteht aus 3 Drawables in einem LayerDrawable.
- Schicht 1 ist der Hintergrund
- Schicht 2 ist die sekundäre Fortschrittsfarbe
- Ebene 3 ist die Hauptfarbe des Fortschrittsbalkens
Im folgenden Beispiel werde ich die Farbe des Hauptfortschrittsbalkens in Cyan ändern.
//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);
In diesem Beispiel wurde eine Volltonfarbe festgelegt. Sie können durch Ersetzen eine Verlaufsfarbe festlegen
shpDrawable.getPaint().setColor(Color.CYAN);
mit
Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
shpDrawable.getPaint().setShader(shader);
Prost.
-Lanze