it-swarm.com.de

Ändern Sie die Farbe des horizontalen Fortschrittsbalkens

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.

143
Nishant Shah

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. 

332
Ryan

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>
94
Nitin Saxena

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.

34
amfcosta

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.

24
Ali Zeynali

für API Level 21 oder höher nur verwenden

Android:progressBackgroundTint="@color/yourBackgroundColor"
Android:progressTint="@color/yourColor"
9

Es gibt drei Möglichkeiten, diese Frage zu lösen:

  1. So stellen Sie die Progressbar-Farbe deklarativ ein
  2. Wie Sie die Fortschrittsbalkenfarbe programmgesteuert anpassen, wählen Sie die Farbe jedoch aus verschiedenen vorgegebenen Farben, die vor der Kompilierzeit deklariert wurden
  3. Wie Sie die Fortschrittsbalkenfarbe programmgesteuert anpassen und die Farbe auch programmgesteuert erstellen.

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:


Wie man die Fortschrittsbalkenfarbe programmgesteuert anpasst, aber die Farbe aus einer vorgegebenen, in XML deklarierten Farbe auswählen

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)

Wie Sie die Fortschrittsbalkenfarbe programmgesteuert anpassen und die Farbe auch programmgesteuert erstellen

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. 

  1. Schicht 1 ist der Hintergrund
  2. Schicht 2 ist die sekundäre Fortschrittsfarbe
  3. Layer 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);

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

5
lance.dolan

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

2
Štarke

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

2
Sazid

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.

1
Pier Betos

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);
}
1
Milan Hlinák

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

0
Juyel Rana

Das hat bei mir funktioniert. für API-Ebene 21 und höher

 Android:indeterminateTint="@color/white"
0
Ghanshyam Nayma

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.

0
Mubashar

letzte LayerDrawable-Layer = (LayerDrawable) progressBar.getProgressDrawable (); layer.getDrawable (2) .setColorFilter (color, PorterDuff.Mode.SRC_IN);

0
user3135773