Ich habe Horizontale Fortschrittsleiste gesetzt.
Ich möchte die Fortschrittsfarbe von Gelb ändern.
<ProgressBar
Android:id="@+id/progressbar"
Android:layout_width="80dip"
Android:layout_height="20dip"
Android:focusable="false"
style="?android:attr/progressBarStyleHorizontal" />
Das Problem ist, dass die Fortschrittsfarbe in den verschiedenen Geräten unterschiedlich ist ... Also möchte ich, dass die Fortschrittsfarbe festgelegt wird.
Ich habe dies von einer meiner Apps kopiert, also gibt es vielleicht ein paar zusätzliche Attribute, aber sollte Ihnen die Idee geben. Dies ist aus dem Layout mit der Fortschrittsleiste:
<ProgressBar
Android:id="@+id/ProgressBar"
style="?android:attr/progressBarStyleHorizontal"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:indeterminate="false"
Android:maxHeight="10dip"
Android:minHeight="10dip"
Android:progress="50"
Android:progressDrawable="@drawable/greenprogress" />
Dann erstellen Sie ein neues Zeichenelement mit etwas ähnlichem (In diesem Fall greenprogress.xml):
<?xml version="1.0" encoding="utf-8"?>
<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="#33FF33"
Android:endColor="#008000"
Android:angle="270" />
</shape>
</clip>
</item>
</layer-list>
Sie können die Farben nach Bedarf ändern. Dadurch wird ein grüner Fortschrittsbalken angezeigt.
Eine einfachere Lösung:
progess_drawable_blue
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:id="@Android:id/background">
<shape>
<solid
Android:color="@color/disabled" />
</shape>
</item>
<item
Android:id="@Android:id/progress">
<clip>
<shape>
<solid
Android:color="@color/blue" />
</shape>
</clip>
</item>
</layer-list>
Wenn Sie nur die Farbe der Fortschrittsleiste ändern möchten, können Sie einfach einen Farbfilter in der onCreate () - Methode Ihrer Activity verwenden:
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);
Idee von hier .
Sie müssen dies nur für Versionen vor Lollipop tun. Auf Lollipop können Sie das styleAttribut colorAccent verwenden.
Erstellen Sie einfach einen Stil in values/styles.xml
.
<style name="ProgressBarStyle">
<item name="colorAccent">@color/greenLight</item>
</style>
Legen Sie dann diesen Stil als Ihr ProgressBar
-Design fest.
<ProgressBar
Android:theme="@style/ProgressBarStyle"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
es spielt keine Rolle, ob Ihr Fortschrittsbalken horizontal oder kreisförmig ist.
für API Level 21 oder höher nur verwenden
Android:progressBackgroundTint="@color/yourBackgroundColor"
Android:progressTint="@color/yourColor"
Es gibt drei Möglichkeiten, diese Frage zu lösen:
Insbesondere bei # 2 und # 3 gibt es viele Verwirrungen, wie in den Kommentaren zur Antwort von amfcosta zu sehen ist. Diese Antwort führt zu unvorhersehbaren Farbergebnissen, wenn Sie die Fortschrittsleiste mit Ausnahme von Primärfarben einstellen möchten, da nur die Hintergrundfarbe geändert wird und der eigentliche "Clip" -Bereich der Fortschrittsleiste immer noch eine gelbe Überlagerung mit verringerter Deckkraft ist. Die Verwendung dieser Methode zum Einstellen des Hintergrunds auf dunkelviolett führt beispielsweise zu einer Fortschrittsbalkenfarbe mit einer verrückten rosafarbenen Farbe, die sich aus dunkelviolettem und gelbem Mischen mit reduziertem Alpha ergibt.
Auf jeden Fall wird # 1 von Ryan perfekt beantwortet, und Štarke beantwortet die meisten von # 3, aber für alle, die eine vollständige Lösung für # 2 und # 3 suchen:
res/drawable/my_progressbar.xml:
Erstellen Sie diese Datei, ändern Sie jedoch die Farben in my_progress und my_secondsProgress:
(HINWEIS: Dies ist nur eine Kopie der eigentlichen XML-Datei, in der die Standard-ProgressBar-Komponente für Android SDK definiert ist, 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)
EDIT: Ich habe die Zeit gefunden, dieses Problem richtig zu lösen. Meine frühere Antwort hat dies etwas mehrdeutig gemacht.
Eine Fortschrittsleiste besteht aus 3 Drawables in einer LayerDrawable.
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);
Für dieses Beispiel wurde eine Volltonfarbe festgelegt. Sie können es durch Ersetzen auf eine Verlaufsfarbe setzen
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
Für alle, die programmgesteuert suchen:
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);
Das Festlegen von IDs auf Drawables ist von entscheidender Bedeutung und sorgt dafür, dass Grenzen und der tatsächliche Status des Fortschrittsbalkens beibehalten werden
Die einfachste Lösung, die ich herausgefunden habe, ist ungefähr so:
<item name="colorAccent">@color/white_or_any_color</item>
Legen Sie die obige Datei in der Datei styles.xml
im Ordner res > values
ab.
HINWEIS: Wenn Sie eine andere Akzentfarbe verwenden, sollten die bisherigen Lösungen gut sein.
API 21 oder HÖHER
Ihr macht mir wirklich Kopfschmerzen. Was Sie tun können, ist machen Sie Ihre Layer-Liste zuerst über xml zeichnbar (bedeutet einen Hintergrund als erste Ebene, eine Zeichenfläche, die den sekundären Fortschritt als zweite Ebene darstellt, und eine weitere Zeichenfläche, die den primären Fortschritt als darstellt die letzte Ebene), ändern Sie die Farbe des Codes, indem Sie folgendermaßen vorgehen:
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(<whichever is your index of Android.R.id.progress>);
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);
}
}
Diese Methode gibt Ihnen die größtmögliche Flexibilität, wenn Sie das Maß Ihres ursprünglichen Zeichnungselements auf der XML-Datei deklarieren lassen, OHNE ÄNDERUNGEN AN DER STRUKTUR NACH DEM ÜBERWACHEN, vor allem wenn Sie den Ordner für die XML-Datei für den Bildschirmordner benötigen Code. Keine erneute Instanziierung einer neuen ShapeDrawable von Grund auf.
Die Farbe der Fortschrittsleiste kann wie folgt geändert werden:
/res/values/colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorAccent">#FF4081</color>
</resources>
/res/values/styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorAccent">@color/colorAccent</item>
</style>
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);
}
Erstellen Sie eine zeichnbare Ressource, welchen Hintergrund Sie benötigen. In meinem Fall habe ich sie bg_custom_progressbar.xml genannt
<?xml version="1.0" encoding="utf-8"?>
<item>
<shape Android:shape="rectangle" >
<corners Android:radius="5dp"/>
<gradient
Android:angle="180"
Android:endColor="#DADFD6"
Android:startColor="#AEB9A3" />
</shape>
</item>
<item>
<clip>
<shape Android:shape="rectangle" >
<corners Android:radius="5dp" />
<gradient
Android:angle="180"
Android:endColor="#44CF4A"
Android:startColor="#2BB930" />
</shape>
</clip>
</item>
<item>
<clip>
<shape Android:shape="rectangle" >
<corners Android:radius="5dp" />
<gradient
Android:angle="180"
Android:endColor="#44CF4A"
Android:startColor="#2BB930" />
</shape>
</clip>
</item>
Dann nutzen Sie diesen benutzerdefinierten Hintergrund wie
<ProgressBar
Android:id="@+id/progressBarBarMenuHome"
style="?android:attr/progressBarStyleHorizontal"
Android:layout_width="match_parent"
Android:layout_height="20dp"
Android:layout_marginStart="10dp"
Android:layout_marginEnd="10dp"
Android:layout_marginBottom="6dp"
Android:indeterminate="false"
Android:max="100"
Android:minWidth="200dp"
Android:minHeight="50dp"
Android:progress="10"
Android:progressDrawable="@drawable/bg_custom_progressbar" />
Es funktioniert gut für mich
Das hat bei mir funktioniert. für API-Ebene 21 und höher
Android:indeterminateTint="@color/white"
die obigen Antworten ändern die gesamte Hintergrundfarbe und es ist unumstritten, dass die Höhe des Fortschrittsbalkens in sehr max. geändert wird, was sich in XML nicht ändern kann. Eine bessere Möglichkeit, nur den Status des Fortschrittsbalkens so zu ändern, dass er abgeschlossen ist, d. h. 20% rote Farbe, 50% gelbe Farbe 70% und darüber grüne Farbe. Sie können es programmgesteuert in Java machen.
teilen Sie Ihre Antwort mit, wenn Sie eine andere Lösung haben.
letzte LayerDrawable-Layer = (LayerDrawable) progressBar.getProgressDrawable (); layer.getDrawable (2) .setColorFilter (color, PorterDuff.Mode.SRC_IN);