2012-06-08 5 views
27

Ich habe eine Fortschrittsbalken mit der ProgressBar-Klasse.Ändern Sie die Fortschrittsbalkenfarbe nur durch CODE in Android

Genau dies zu tun:

progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); 

Ich brauche die Farbe des einen ändern, Eingabewert mit etwa so:

int color = "red in RGB value".progressBar.setColor(color) 

oder so ähnlich ...

I kann kein XML-Layout verwenden, da die Fortschrittsleiste für Benutzer anpassbar ist.

Antwort

15

Als ich hier Hilfe zu einem Thema gefunden, aber die Verbindung nicht mehr erinnern kann, ich bin Entsendung meine volle Lösung, die für meine Bedürfnisse große Werke:

// Draw a simple progressBar from xml 
    progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); 

    // Convert the color (Decimal value) to HEX value: (e.g: #4b96a0) 
    String color = colorDecToHex(75, 150, 160); 

    // Define a shape with rounded corners 
    final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; 
    ShapeDrawable pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners,  null, null)); 

    // Sets the progressBar color 
    pgDrawable.getPaint().setColor(Color.parseColor(color)); 

    // Adds the drawable to your progressBar 
    ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL); 
    progressBar.setProgressDrawable(progress); 

    // Sets a background to have the 3D effect 
    progressBar.setBackgroundDrawable(Utils.getActivity().getResources() 
      .getDrawable(android.R.drawable.progress_horizontal)); 

    // Adds your progressBar to your layout 
    contentLayout.addView(progressBar); 

Und hier ist der Code zu konvertieren DECIMAL Farbwerte hexadezimal:

public static String colorDecToHex(int p_red, int p_green, int p_blue) 
{ 
    String red = Integer.toHexString(p_red); 
    String green = Integer.toHexString(p_green); 
    String blue = Integer.toHexString(p_blue); 

    if (red.length() == 1) 
    { 
     red = "0" + red; 
    } 
    if (green.length() == 1) 
    { 
     green = "0" + green; 
    } 
    if (blue.length() == 1) 
    { 
     blue = "0" + blue; 
    } 

    String colorHex = "#" + red + green + blue; 
    return colorHex; 
} 

Ich denke, die letzte Methode ist nicht so sauber, aber es funktioniert gut.

Hoffe, dass dies gut helfen, zu viel Zeit auf dieser Fortschrittsbalken verschwendet.

+0

fast funktioniert, aber wenn Sie die Höhe der Fortschrittsbalken ändern, wird der Hintergrund ausziehbar zu groß – kenyee

13

Es ist möglich, die Fortschrittsbalken, indem die Farbfilter auf dem Fortschrittsbalken ziehbar kolorieren:

Drawable drawable = progressBar.getProgressDrawable(); 
drawable.setColorFilter(new LightingColorFilter(0xFF000000, customColorInt)); 
+1

Das ist, was ich versuchte. Allerdings, mit dieser Methode sind die Farben ein bisschen seltsam ... In der Tat, wenn ich nur die Farbe haben möchte: RGB = # 5ea618 mit einer dunkelgrauen Hintergrundfarbe, was soll ich tun? Denn wenn ich zum Beispiel mache: neue LightingColorFilter (0xFF000000, 0xFF5ea618)); Die Fortschrittsbalkenfarbe ist grün, aber ich kann nicht sehen, wie sie sich bewegt. – hico

+0

Wenn Sie die volle Kontrolle haben wollen, sollten Sie die Grafiken des Fortschrittsbalkens selbst erstellen. – Moritz

+1

tönt sowohl Hintergrund und Vordergrund – desgraci

32

Dies wird viel nicht nötig, helfen so viel zu tun Codierung :)

ProgressBar spinner = new android.widget.ProgressBar(
      context, 
      null, 
      android.R.attr.progressBarStyle); 

spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000,android.graphics.PorterDuff.Mode.MULTIPLY); 
+4

Nur eine kurze Notiz, dass dies sowohl Hintergrund + Vordergrund Farben getönt und 'getIndeterminateDrawable() 'muss in 'getProgressDrawable() 'geändert werden, wenn ein bestimmter Fortschrittsbalken verwendet wird. – JakeSteam

+0

gibt es eine Möglichkeit, den Vordergrund mit wechselndem Hintergrund zu färben? – Prakash

6

aktualisieren

In neueren Versionen von Android (21 Werke), können Sie die Farbe eines progressbar ändern programmatisch indem Sie einfach setProgressTintList verwenden.

Um es rot, Nutzung:

//bar is a ProgressBar 
bar.setProgressTintList(ColorStateList.valueOf(Color.RED)); 
+0

nein es funktioniert nicht –

+0

Sie müssen 'setSecondaryProgressTintList' und/oder' setIndeterminateTintList' abhängig von der Verwendung der ProgressBar aufrufen. – Cristan

6

Das ist für mich mit AppCompat funktioniert: DrawableCompat.setTint (progressBar.getProgressDrawable(), tintColor);

+0

Nein, dies tönt beide Hintergrund + Vordergrund Farben ... –

+0

Das funktioniert purrrrfectly gut! Vielen Dank.Es stellt den Vollfarbwert automatisch auf den Hauptfortschritt und die transparente Version der Farbe auf den Fortschrittspfad ein. – sud007

3

I Standardfarbe in xml von ziehbar gegeben haben.

Ich habe es programmatisch geändert.

activity_splasg. xml:

<ProgressBar 
     android:id="@+id/splashProgressBar" 
     android:progressDrawable="@drawable/splash_progress_drawable" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:max="100" 
     android:progress="50" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_alignParentBottom="true" /> 

splash_progress_drawable.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> 
      <solid 
       android:color="@android:color/transparent" /> 
     </shape> 
    </item> 

    <item 
     android:id="@android:id/progress"> 
     <clip> 
      <shape> 
       <solid 
        android:color="#e5c771" /> 
      </shape> 
     </clip> 
    </item> 

</layer-list> 

Wie jetztProgressDrawable Farbe programmatisch ändern.

ProgressBar splashProgressBar = (ProgressBar)findViewById(R.id.splashProgressBar); 

Drawable bgDrawable = splashProgressBar.getProgressDrawable(); 
bgDrawable.setColorFilter(Color.BLUE, android.graphics.PorterDuff.Mode.MULTIPLY); 
splashProgressBar.setProgressDrawable(bgDrawable); 

Hoffe, das wird Ihnen helfen.

+1

Nein, die programmatische Lösung tönt sowohl Hintergrund- als auch Vordergrundfarben ... –

1

progressbar.setIndeterminateTintList(ColorStateList.valueOf(Color.RED));

Es funktioniert nur über API 21

9

Im Fall, dass Sie den Hintergrund und die Fortschrittsbalken in verschiedenen Farben färben müssen.

progress_drawable.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 android:shape="rectangle" > 
      <solid android:color="@color/white" /> 
     </shape> 
    </item> 
    <item android:id="@android:id/progress"> 
     <clip> 
      <shape> 
       <solid android:color="@color/green" /> 
      </shape> 
     </clip> 
    </item> 
</layer-list> 

Es ist möglich, programmatisch, seine Schicht-Listenelemente decompound, und sie separat tönen:

LayerDrawable progressBarDrawable = (LayerDrawable) progressBar.getProgressDrawable(); 
Drawable backgroundDrawable = progressBarDrawable.getDrawable(0); 
Drawable progressDrawable = progressBarDrawable.getDrawable(1); 

backgroundDrawable.setColorFilter(ContextCompat.getColor(this.getContext(), R.color.white), PorterDuff.Mode.SRC_IN); 
progressDrawable.setColorFilter(ContextCompat.getColor(this.getContext(), R.color.red), PorterDuff.Mode.SRC_IN); 
+0

Ich habe diese Lösung aber mit 'DrawableCompat.setTint()' anstelle von 'setColorFilter()' verwendet und es hat super funktioniert. Dies ist der einzige Weg, den ich gefunden habe, so dass die Hintergrundfarbe auch nicht verändert wird. – Franco

0

Layout-= activity_main.xml:

<ProgressBar 
    android:id="@+id/circle_progress_bar_middle" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_centerInParent="true" 
    android:max="100" 
    android:rotation="-90" 
    android:indeterminate="false" 
    android:progressDrawable="@drawable/my_drawable_settings2" /> 

In Java Aktivität/Fragment:

ProgressBar myProgressBar = (ProgressBar) view.findViewById(R.id.circle_progress_bar_middle); 
myProgressBar.setProgressDrawable(getResources().getDrawable(R.my_drawable_settings1)); 

Die my_drawable_settings1.xml Datei in Ihrem ziehbar/MipMap Ordner:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:id="@android:id/progress"> 
     <shape 
      android:innerRadius="55dp" 
      android:shape="ring" 
      android:thickness="9dp" 
      android:useLevel="true"> 

      <gradient 
       android:startColor="#3594d1" 
       android:endColor="@color/white" 
       android:type="sweep" /> 
     </shape> 
    </item> 
</layer-list> 

Wo my_drawable_settings1 und my_drawable_settings2.xml verschiedene Farben haben.

-1

wenn Sie Farbe der Statusleiste ändern möchten programmatisch dann kopieren Sie hinter diesem Code es funktioniert 100%

mainProgressBar.getIndeterminateDrawable().setColorFilter(Color.GREEN, PorterDuff.Mode.MULTIPLY); 
+0

funktionierte nicht für mich –

Verwandte Themen