Android'de ProgressBar'ın ilerleme göstergesi rengini değiştirme


178

Yatay ayarladım ProgressBar.

İlerleme rengini sarıya değiştirmek istiyorum.

<ProgressBar 
    android:id="@+id/progressbar" 
    android:layout_width="80dip" 
    android:layout_height="20dip"  
    android:focusable="false" 
    style="?android:attr/progressBarStyleHorizontal" />

Sorun şu ki, ilerleme rengi farklı cihazlarda farklı. Yani, ilerleme rengini düzeltmesini istiyorum.


yukarıdaki cevaplar tüm arka plan rengini değiştirir ve ilerleme çubuğunun yüksekliğini xml'de değiştirilemeyen çok maks. sadece ilerleme çubuğu durumunu değiştirmenin daha iyi bir yolu% 20 kırmızı renk,% 50 sarı renk% 70 ve yeşil rengin üzerindedir. Java ile programlı olarak yapabilirsiniz. Başka bir çözümünüz varsa cevabınızı paylaşın.
Mubashar

Yanıtlar:


365

Bunu uygulamalarımdan birinden kopyaladım, bu yüzden birkaç ekstra özellik var, ancak size fikir vermeli. Bu, ilerleme çubuğuna sahip düzenden:

<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" />

Sonra aşağıdakine benzer bir şeyle yeni bir çekilebilir oluşturun (Bu durumda 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:angle="270"
                android:centerColor="#ff5a5d5a"
                android:centerY="0.75"
                android:endColor="#ff747674"
                android:startColor="#ff9d9e9d" />
        </shape>
    </item>

    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                    android:angle="270"
                    android:centerColor="#80ffb600"
                    android:centerY="0.75"
                    android:endColor="#a0ffcb00"
                    android:startColor="#80ffd300" />
            </shape>
        </clip>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                    android:angle="270"
                    android:endColor="#008000"
                    android:startColor="#33FF33" />
            </shape>
        </clip>
    </item>

</layer-list>

Renkleri gerektiği gibi değiştirebilirsiniz, bu size yeşil bir ilerleme çubuğu verir.


Ve ayrıca bu android kaldırmak: indeterminate = "false"
Nishant Shah

2
Lütfen bana yardım et. Kodunuzu kopyalayarak greenprogress.xml oluşturmaya çalışıyorum, ancak Android Studio 0.4.6 <layer-list> olarak işaretleyin ve "Öğe listesi bildirilmelidir" hatası ne yapmalıyım?
UmAnusorn

1
Rengi dinamik olarak değiştirmek mümkün müdür?
async

gerçek çubukta tanımlanan mevcut ilerleme değerine bağlı olarak renk değiştirilebilir mi?
Jonathan

Ne açıklamak yararlı olacaktır @Ryan android:id="@android:id/progress", android:id="@android:id/background"ve android:id="@android:id/secondaryProgress"ayakta.
RustamG

103

Daha basit bir çözüm:

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>

1
Burada renk @ / devre dışı özel bir renk olduğunu
Nitin Saxena

2
Ya da <katı android: renk = "@ android: renk / siyah" />, hatta <katı android: renk = "# ff33b5e5" />
superarts.org 18:14

2
Bu yeterli android: API kolu 21 ve üstü için indeterminateTint = "@ color / white"
Ghanshyam Nayma 13:18

53

Sadece bir stil oluşturun values/styles.xml.

<style name="ProgressBarStyle">
    <item name="colorAccent">@color/greenLight</item>
</style>

Ardından bu stili ProgressBartemanız olarak ayarlayın .

<ProgressBar
    android:theme="@style/ProgressBarStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

ve ilerleme çubuğunuzun yatay veya dairesel olması önemli değildir. Bu kadar.


1
Wow, en basit çözüm, benim için çalışıyor. Bu cevabın neden bu kadar çok oy aldığını merak ettim.
Pavel Shorokhov

38

Yalnızca ilerleme çubuğu rengini değiştirmek istiyorsanız, Aktivitenin onCreate () yönteminde bir renk filtresi kullanabilirsiniz:

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);

Buradan fikir .

Bunu sadece lolipop öncesi versiyonlar için yapmanız gerekir. Lollipop'ta colorAccent stil niteliğini kullanabilirsiniz.


İçin SeekBaraynı olduğunu, sadece API 16 için ekleyin: seekBar.getThumb().setColorFilter(color, PorterDuff.Mode.SRC_IN);. Bu, yuvarlak baş parmağın rengini değiştirir.
Sufyan

1
setColorFilter()Bir çekmeceye doğrudan çağrı yapmak rengi her yere uygulayacaktır. Bu ben gerek yoktu tutar olduğundan, sadece denilen mutate()üzerinde Drawable(yani gibiseekBar.getThumb().mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN);
Sufian

3
Bu çözümü başka bir yerde gördüm, ancak tek yaptığı (bir Gingerbread cihazında test etmek) tüm ilerleme çubuğunu tek bir renkte çevirmek, gerçek ilerlemeyi görmeyi imkansız hale getirmek
Neil C. Obremski

@ NeilC.Obremski evet haklısın. ROM'a veya belki de sürüme özgü olabilir. Tamamen çıkarmak zorunda kaldım. Umarım bunu yakında Android'in eski sürümlerine taşıyacağız (destek lib aracılığıyla).
Sufian

25

API seviye 21 veya üstü için

android:progressBackgroundTint="@color/yourBackgroundColor"
android:progressTint="@color/yourColor"

6

Bu soruyu çözmenin 3 yolu vardır:

  1. İlerleme çubuğu rengini bildirici olarak ayarlama
  2. İlerleme çubuğu rengini programlı olarak ayarlama, ancak derleme saatinden önce belirtilen çeşitli önceden belirlenmiş renklerden rengi seçme
  3. İlerleme çubuğu rengini programlı olarak ayarlama ve ayrıca rengi programlı olarak oluşturma.

Özellikle amfcosta'un cevabına yapılan yorumlarda görüldüğü gibi # 2 ve # 3 hakkında çok fazla karışıklık var. Bu yanıt, ilerleme çubuğunu yalnızca arka plan rengini değiştirdiğinden ve gerçek ilerleme çubuğu "klip" alanı azaltılmış opaklığa sahip sarı bir kaplama olacağından, ilerleme çubuğunu birincil renkler dışında herhangi bir şeye ayarlamak istediğinizde öngörülemeyen renk sonuçları verir. Örneğin, arka planı koyu mor olarak ayarlamak için bu yöntemi kullanmak, azaltılmış alfa ile koyu mor ve sarı karışımından kaynaklanan bazı çılgın pembemsi renkte bir ilerleme çubuğu "klip" rengiyle sonuçlanır.

Her neyse, # 1, Ryan tarafından yanıtlandı ve Štarke # 3'ün çoğuna cevap veriyor, ancak # 2 ve # 3'e tam bir çözüm arayanlar için:


İlerleme çubuğu rengini programlı olarak ayarlama, ancak XML'de bildirilen önceden belirlenmiş bir renkten rengi seçme

res / çekilebilir / my_progressbar.xml :

Bu dosyayı oluşturun ancak my_progress ve my_secondsProgress içindeki renkleri değiştirin:

(NOT: Bu, varsayılan android SDK ProgressBar'ı tanımlayan gerçek XML dosyasının bir kopyasıdır, ancak kimlikleri ve Renkleri değiştirdim. Orijinal adı progress_horizontal olarak adlandırılır)

<?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>

Java'nızda :

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)

İlerleme çubuğu rengini programlı olarak ayarlama ve ayrıca rengi programlı olarak oluşturma

EDIT: Bunu düzgün çözmek için zaman buldum. Eski cevabım bunu biraz belirsiz bıraktı.

ProgressBar, LayerDrawable'da 3 Drawable olarak oluşturulur.

  1. Katman 1 arka plan
  2. Katman 2, ikincil ilerleme rengidir
  3. Katman 3 ana ilerleme çubuğu rengidir

Aşağıdaki örnekte ana ilerleme çubuğunun rengini camgöbeği olarak değiştireceğim.

//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);

Bu örnek onu düz bir renge ayarladı. Değiştirerek degrade rengine ayarlayabilirsiniz.

shpDrawable.getPaint().setColor(Color.CYAN);

ile

Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
shpDrawable.getPaint().setShader(shader);

Şerefe.

Lance


viewUtils.convertDpToPixel (5) içindeki viewUtils nedir;
Nikos Hidalgo

1
Merhaba @NikosHidalgo - Burada neredeyse aynı yöntemi görebilirsiniz: stackoverflow.com/questions/12849366/… . Aradaki tek fark, ViewUtilsbir referansla benim inşa etmem Context, böylece Contextçağrı yaparken bir zaman convertDpToPixel()
geçmem gerekmiyor

Hızlı yanıtınız için teşekkür ederiz, özellikle çok uzun zaman önce gönderilen bir cevapta!
Nikos Hidalgo

Haha, gerçekten hatırlamak için beynimi uzatmak zorunda kaldım: p
lance.dolan

4

API düzeyinde 21 veya daha üstündeyseniz, şu XML özelliklerini kullanabilirsiniz:

<!-- For indeterminate progress bar -->
android:indeterminateTint="@color/white"
<!-- For normal progress bar -->
android:progressTint="@color/white"

3

Bulduğum en basit çözüm şöyle:

<item name="colorAccent">@color/white_or_any_color</item>

Yukarıdakileri klasör styles.xmlaltındaki dosyaya koyun res > values.

NOT: Başka bir vurgu rengi kullanırsanız, önceki çözümlerin iyi olması gerekir.

API 21 veya YÜKSEK


Bu en iyi çözümdür. % 100 sorulan soru ile ilgilidir. very simple
Pir Fahim Shah

3
final LayerDrawable layers = (LayerDrawable) progressBar.getProgressDrawable();
layers.getDrawable(2).setColorFilter(color,PorterDuff.Mode.SRC_IN);

1
Cevabınıza biraz açıklama eklemeye çalışın. Yalnızca kod yanıtları önerilmez.
Alexei

Ben getDrawable indeks 2 arkasında bir açıklama almak isterdim, ama en azından bu benim için çalışan tek çözüm oldu, çok teşekkürler!
Nikos Hidalgo

2

Programlı olarak nasıl yapılacağını arayan herkes için:

    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);

Kimliklerin çekilebilir malzemelere ayarlanması çok önemlidir ve sınırların ve gerçek ilerleme durum çubuğunun korunmasına özen gösterir


1

Siz gerçekten başım ağrıyor. Yapabileceğiniz şey, katman listenizi önce xml ile çizilebilir yapmaktır (yani, birinci katman olarak arka plan, ikinci katman olarak ikincil ilerlemeyi temsil eden bir çekilebilir ve son katman olarak birincil ilerlemeyi temsil eden başka bir çekilebilir), ardından değiştirin aşağıdakileri yaparak koddaki renk:

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);
    }
}

Bu yöntem, özellikle xml dosya ekran klasörüne özel gereksinim duyuyorsanız, yalnızca xml dosya ekran klasörüne sahip olmanız gerekiyorsa, sadece xml üzerinde orijinal çekilebilir ölçümün bildirilmesine ilişkin en iyi esnekliği verecektir. kodu. Sıfırdan yeni bir ShapeDrawable yeniden başlatılmasına gerek yok.


1

ProgressBar rengi aşağıdaki gibi değiştirilebilir:

/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

İhtiyacınız olan arka planı çekilebilir bir kaynak oluşturun, benim durumumda bg_custom_progressbar.xml

<?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>

Sonra bu özel arka planı aşağıdaki gibi kullanın:

 <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" />

Benim için iyi çalışıyor


0

Xml dilinde:

<ProgressBar
                    android:id="@+id/progressBar"
                    style="?android:attr/progressBarStyleInverse"
                    android:layout_width="60dp"
                    android:layout_height="60dp"
                    android:layout_margin="@dimen/dimen_10dp"


                 android:indeterminateTint="@{viewModel.getComplainStatusUpdate(position)}"
                    android:indeterminate="true"
                    android:indeterminateOnly="false"
                    android:max="100"
                    android:clickable="false"
                    android:indeterminateDrawable="@drawable/round_progress"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

ViewModel:

fun getComplainStatusUpdate(position: Int):Int{

                val list = myAllComplainList!!.getValue()
                if (list!!.get(position).complainStatus.equals("P")) {
                  //  progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
                   // progressBar.setBackgroundResource(R.drawable.circle_shape)
                    return Color.RED
                } else if (list!!.get(position).complainStatus.equals("I")) {

                    return Color.GREEN
                } else {

                    return Color.GREEN
                }


return Color.CYAN
    }

0

Malzeme Bileşenleri Kütüphanesi ProgressIndicatorile app:indicatorColorrengi değiştirmek için with niteliğini kullanabilirsiniz:

  <com.google.android.material.progressindicator.ProgressIndicator
      style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Determinate"
      app:indicatorColor="@color/..."
      app:indicatorWidth="..."
      app:trackColor="@color/..."
      />

resim açıklamasını buraya girin

Not : en azından sürüm gerektirir1.3.0-alpha01 .

İle ProgressBarkullandığınız rengi geçersiz kılabilirsiniz:

<ProgressBar
    android:theme="@style/CustomProgressBarTheme"
    ..>

ile:

<style name="CustomProgressBarTheme">
    <item name="colorAccent">@color/primaryDarkColor</item>
</style>

resim açıklamasını buraya girin


0

Android'de programlı olarak birincil ve ikincil ilerleme rengini yatay ilerleme çubuğuna ayarlamak istiyorsanız, aşağıdaki snippet'i kullanın

int[][] states = new int[][] {
                        new int[] {-android.R.attr.state_checked},
                        new int[] {android.R.attr.state_checked},
                };

                int[] secondaryColor = new int[] {
                        context.getResources().getColor(R.color.graph_line_one),
                        Color.RED,
                };

                int[] primaryColor = new int[] {
                        context.getResources().getColor(R.color.middle_progress),
                        Color.BLUE,
                };
                progressbar.setProgressTintList(new ColorStateList(states, primaryColor));
                progressbar.setSecondaryProgressTintList(new ColorStateList(states, secondaryColor));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.