Android'de ilerleme çubuğunun ilerleme rengini değiştirme


475

Android uygulamamda yatay bir ilerleme çubuğu kullanıyorum ve ilerleme rengini (varsayılan olarak Sarı olan) değiştirmek istiyorum. code(XML değil) kullanarak nasıl yapabilirim ?


İstediğiniz renkle bir bitmap belirterek MyProgressBar.setProgressDrawable (Drawable d) öğesini denediniz mi? developer.android.com/reference/android/widget/… developer.android.com/reference/android/graphics/drawable/…
fupsduck

2
Evet denedim ama işe yaramıyor. Yalnızca çubuğun kendisinin arka plan rengini ayarlamak yerine tüm ilerleme çubuğu görünümünün arka plan rengini ayarlar. Teşekkürler.
WhiteTigerK

22
android:indeterminateTint="@android:color/white"yalnızca API üzerinde çalışır> = 21
Madeyedexter

Yanıtlar:


291

Bunun cevabı olmadığı için özür dilerim, ancak koddan ayarlama gereksinimini artıran nedir? Ve .setProgressDrawabledoğru tanımlanmışsa çalışmalıdır

<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="@color/progress_start"
                android:endColor="@color/progress_end"
                android:angle="270" 
            />
        </shape>
    </clip>
</item>

</layer-list>

4
Bunun nedeni, ilerleme çubuğunu dinamik olarak oluşturmam ve kullanıcı isteği üzerine rengini ayarlamam. Genellikle GUI ekranımı ve bileşenlerini oluşturmak için kod kullandığım için, ekli XML'ye aşina değilim ve bir katman listesinin ne olduğunu bilmiyorum (birkaç katmana dayalı ilerleme çubuğu oluşturduğunuzu tahmin ediyorum) ..). Eklediğiniz XML'i kullanmak istemem durumunda - onu projenin klasörüne nereye yerleştirmeliyim ve XML ayarlarına dayalı bir ilerleme çubuğu oluşturmak için yapmam gereken başka bir şey var mı? Teşekkürler.
WhiteTigerK

1
Bu xml dosyasını bir dosya olarak kaydedip MyProgressBar.setProgressDrawable () öğesinde çizilebilir olarak ayarladığınızdan çizilebilir klasöre (diyelim my_progress.xml) koyarsınız. Renkleri değiştirmek için bu değerleri @ color / progress_start @ color / progress_end Temelde bir gradyan ve oraya hex koyabilirsiniz.
Alex Volovoy

3
Not - dosya, SDK'daki dosyanın kopyasıdır. Buraya telif hakkını bıraktım. Res / drawable klasörüne bakarsanız, tam olarak ne gönderdiğimi görürsünüz - renkler, özel renkler yerine sarı degradeye ayarlanır.
Alex Volovoy

7
Bana herhangi bir renk değişikliği göstermiyor. Lütfen işe yarayan rengi söyleyin.
Praveen

Merhaba Alex, cevaplarınız çok güzel. Ancak, çalışma zamanında özel ilerleme tekerlek rengini değiştirmeye çalıştım. Ama ben yapamadım. lütfen sorunumu çözmeme yardım et .. ilerleme% 100'e ulaştıktan sonra, o zaman rengi değiştir ve ilerlemeye başla .. i kodu indir .. stackoverflow.com/questions/18503718/…
harikrishnan

485

Yatay bir ProgressBar için aşağıdaki gibi bir de kullanabilirsiniz ColorFilter:

progressBar.getProgressDrawable().setColorFilter(
    Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);

Renk filtresini kullanarak Kırmızı ProgressBar

Not: Bu, uygulamanızdaki tüm ilerleme çubuklarının görünümünü değiştirir. Yalnızca belirli bir ilerleme çubuğunu değiştirmek için şunu yapın:

Drawable progressDrawable = progressBar.getProgressDrawable().mutate();
progressDrawable.setColorFilter(Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);
progressBar.setProgressDrawable(progressDrawable);

ProgressBar belirsizse, getIndeterminateDrawable()yerine kullanın getProgressDrawable().

Lollipop'tan (API 21) beri bir ilerleme tonu ayarlayabilirsiniz:

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

İlerleme tonunu kullanan Kırmızı ProgressBar


7
Bu cevabı en basit gibi göründüğüm için kullanmak istedim ama ilerleme çubuğum, ilerleme değerinden bağımsız olarak tamamen kırmızı. Kullanılacak Mod'dan emin misiniz?
LG

33
@resus Ben de aynı sorun var, bar tamamen kırmızı ve hiçbir ilerleme görünür değildi. Ama Mode.SRC_IN'i Mode.MULTIPLY olarak değiştirerek çözdüm.
Derzu

40
getIndeterminateDrawableBelirsiz ilerleme kullanıyorsanız aynı işlemi yapmayı unutmayın .
Thommy

6
Bu bağlamda 'Mod' android.graphics.PorterDuff.Mode
1owk3y

9
arka plan rengini nasıl değiştirmezim? Sadece ilerleme rengini değiştirmek istiyorum.
kangear

364

Bu programsal olarak değil, ama yine de birçok insana yardımcı olabileceğini düşünüyorum.
Çok denedim ve en etkili yolu bu satırları ProgressBar .xml dosyasında eklemek oldu:

            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary"

Sonunda bu kod benim için yaptı:

<ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_marginTop="50dp"
            android:layout_marginBottom="50dp"
            android:visibility="visible"
            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary">

Bu çözüm API 21+ için çalışır


45
Minimum API seviye 21 gerektirir
Apfelsaft

Bu özellikler için dinamik renk ayarlanması gerektiğinde çağrılabilen ayarlayıcı yöntemler de vardır.
racs

Api 21+ ve api <= 20 için özel bir kaynak dosyası oluşturmam gerekir mi? Yoksa bu özellikler api <= 20'de yok sayıldı mı?
prom85

1
@shriduttkothari en iyi nasıl olabilir? ... itibaren 21+
user25

2
Android en az
Tom

229

Belirsiz ilerleme çubuğum (döndürücü) için sadece çekmeceye bir renk filtresi ayarladım. Harika çalışır ve sadece bir satır.

Rengi kırmızıya ayarlama örneği:

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

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

resim açıklamasını buraya girin


16
Cevabınızı en çok beğendim. Benim için çalışmak zorunda olsa da bunu yapmak zorunda: myProgressBarSpinner.getIndeterminateDrawable (). SetColorFilter (yeni LightingColorFilter (0xFF000000, foregroundColorDesired));
Art Geigel

4
Bunu yapmanın, uygulamanızdaki TÜM ilerleme çubuklarının çekilebilir öğelerini değiştireceğini de unutmayın. Bunu yalnızca belirli bir kişiye yapmak için, çekilebilir üzerinde mutate () öğesini çağırın, ardından renk filtresini ayarlayın ve progressBar öğenizde setIntederminateDrawable öğesini arayın.
dimsuz

3
Not: Bunu kullanan ve renklerinin neden koydukları onaltılık dize gibi görünmediğini merak edenler üzerinde Çoklu Renk filtresi var. Değişim android.graphics.PorterDuff.Mode.MULTIPLYiçin PorterDuff.Mode.SRC_INve sizin tam altıgen rengini alacak.
micnguyen

Bence sadece bu cevaba ihtiyacı var ..... android: indeterminateTint = "@ android: renkli / siyah"
Muhammed Adil

4
i olarak kullanılır: progressBar = (ProgressBar) findViewById (R.id.progressBar); progressBar.getIndeterminateDrawable (). setColorFilter (ContextCompat.getColor (bu, android.R.color.white), android.graphics.PorterDuff.Mode.MULTIPLY);
ashishdhiman2007

189

Bu eski bir soru, ama tema kullanımından burada bahsedilmiyor. Varsayılan temanız kullanılıyorsa AppCompat, tanımladığınız ProgressBarrenk olacaktır colorAccent.

Değiştirme colorAccentaynı zamanda ProgressBarrenginizi de değiştirir , ancak değişiklikler birden fazla yere de yansır. Yani, sadece belirli bir renk için farklı bir renk PregressBaristiyorsanız, bunu tema uygulayarak yapabilirsiniz ProgressBar:

  • Varsayılan temanızı genişletin ve geçersiz kılın colorAccent

    <style name="AppTheme.WhiteAccent">
        <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
    </style>
  • Ve özniteliği ProgressBarekleyin android:theme:

    android:theme="@style/AppTheme.WhiteAccent"

Yani şöyle görünecek:

<ProgressBar
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="10dp"
        android:theme="@style/AppTheme.WhiteAccent" />

Yani sadece colorAccentsizin için bir değiştiriyorsunuz ProgressBar.

Not : Kullanmak styleişe yaramaz. Yalnızca kullanmanız gerekir android:theme. Temanın daha fazla kullanımını burada bulabilirsiniz: https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH


18
en sonunda! teşekkürler, pek çok geliştirici AppCompat kullanmıyor gibi görünüyor, birçok kullanıcı sadece API 21+ için çözüm ile cevaplar oy veriyor, hiç iyi değil, mümkün olduğunca fazla cihazı / işletim sistemini desteklemeli
user25

1
Müthiş! Benim için çalıştı, ama bir üst = "@ style / Theme.AppCompat" bir yerde stil hiyerarşisinde bir yerde emin olmak zorunda başka bir ebeveyn vardı ve ilk başta işe yaramadı.
Nublodeveloper

@Nublodeveloper Evet fark ettiyseniz ilk satırda bahsetmiştim.
kirtan403

1
@ kirtan403 Ah, evet, şimdi anlıyorsunuz, ama ilk okuduğumda anlamadım. Çok hızlı okudum ve kod arıyordum. Yine de teşekkürler, cevabınız benim için en iyisi!
Nublodeveloper

+1 Çözümünüzü beğendim. Ama temanın rengini java'da nasıl ayarlayabilirim ??? Örneğin, kırmızı olmasını istiyorsam <color name = "red"> # ff5900 </color>
Maseed

54

Tüm API'lar

tüm API'yı kullanırsanız temayı stil olarak oluşturun

style.xml

<resources>

    //...

    <style name="progressBarBlue" parent="@style/Theme.AppCompat">
        <item name="colorAccent">@color/blue</item>
    </style>

</resources>

ve kullanımda

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

API seviye 21 ve üstü

API seviye 21 ve daha üstü sürümlerde kullanılıyorsa, sadece bu kodu kullanın:

<ProgressBar
   //...
   android:indeterminate="true"
   android:indeterminateTintMode="src_atop"
   android:indeterminateTint="@color/secondary"/>

1
Güzel, bence style.xml yöntemi en iyisidir. (20'den fazla
api'ye

1
Tüm API'lar için bir çözüm istiyorsanız en iyi çözüm Teşekkürler :)
Naveen

34

bazı önerilere göre, bir renk ile bir şekil ve çekilebilir belirtebilir, sonra ayarlayabilirsiniz. Bu programlı çalışıyorum. Ben böyle yaparım ..

Önce çekilebilir kütüphaneyi içe aktardığınızdan emin olun.

import android.graphics.drawable.*;

Sonra aşağıdakine benzer kodu kullanın;

ProgressBar pg = (ProgressBar)row.findViewById(R.id.progress);
final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null,null));
String MyColor = "#FF00FF";
pgDrawable.getPaint().setColor(Color.parseColor(MyColor));
ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
pg.setProgressDrawable(progress);   
pg.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));
pg.setProgress(45);

1
Yukarıdaki kodu denedim, ne yazık ki sadece bir "boş" ilerleme çubuğu ile sonuçlanır. Bir şey mi kaçırıyorum?
OceanBlue

ClipDrawable'da setLevel'i aramanız gerekir. 0 ile 10000 arasında bir değer alır. Yani progress.setLevel (2500)% 25 doludur.
HappyEngineer

1
Cevaba "boş" ilerleme çubuğunun bir nedenini ve bunu düzeltmenin 2 yolunu açıklayan bir düzenleme gönderdim (@ HappyEngineer'ın düzeltmesi dahil)
Richard Le Mesurier

@RichardLeMesurier açıklamayı + 2 yolunu yorum bölümüne gönderebilir misiniz? progress.setLevel(2500)benim için çalışmıyor ve görünüşe göre düzenlemeniz bir nedenden dolayı kabul edilmedi. Teşekkürler. +1.
ateiob


32

Bu benim için çalıştı:

<ProgressBar
 android:indeterminateTint="#d60909"
 ... />

12
Yalnızca API düzey 21 ve üstünde kullanılır
Numair

28

Belirsiz ise:

((ProgressBar)findViewById(R.id.progressBar))
    .getIndeterminateDrawable()
    .setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);

Bunu kullandım, ama canlandırmıyor, sadece renk uygulandı ... Dairesel ilerleme
çubuğu

24

Bu benim için çalışıyor. Ayrıca daha düşük sürümlerde de çalışır. Bunu syles.xml dosyasına ekleyin

<style name="ProgressBarTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorAccent">@color/colorPrimary</item>
</style>

Ve xml'de böyle kullanın

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

Bunu CryptoTweets örnek uygulamasında uyguladım . Bu çözümün beklendiği gibi çalışması için ana temanın gerekli olmadığını gördüm. parent="ThemeOverlay.AppCompat.Light"
Adam Hurwitz

23

Bugünlerde 2016'da bazı Lollipop öncesi cihazların colorAccentayarı onurlandırmadığını gördüm, bu nedenle tüm API'ler için son çözümüm şu:

// fixes pre-Lollipop progressBar indeterminateDrawable tinting
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

    Drawable wrapDrawable = DrawableCompat.wrap(mProgressBar.getIndeterminateDrawable());
    DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
    mProgressBar.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
} else {
    mProgressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
}

Bonus puanlar için, kullanımdan kaldırılmış kod kullanılmaz. Dene!


Çağırmak unutma wrapDrawable.mutate()ileDrawableCompat.setTint(wrapDrawable.mutate(), ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
Tarsem Singh

Android KitKat 4.4.2 üzerinde çalışmıyor.
pradip tilala

Sadece yeni bir 4.4.2 emülatörde denedim ve herhangi bir sorun olmadan çalışır, .xmlayarlarınızı kontrol edin ve ayrıca başka bir şey ProgressBarrengi geçersiz kılıyorsa .
Henrique de Sousa

20

Bu benim yaptığım şey. Çalışmış.

İlerleme çubuğu:

<ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:indeterminateDrawable="@drawable/progressdrawable"
           />

progressdrawable.xml:
Burada rengi istediğiniz gibi değiştirmek için degrade kullanın. Ve android: toDegrees = "X", X değerini arttırır ve ilerleme çubuğu hızlı döner. Azaltın ve yavaşça döndürün.İhtiyaçlarınıza göre özelleştirin.

<?xml version="1.0" encoding="utf-8"?>
     <rotate xmlns:android="http://schemas.android.com/apk/res/android"
            android:duration="4000"
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="360" >

            <shape
                android:innerRadius="20dp"
                android:shape="ring"
                android:thickness="4dp"
                android:useLevel="false" >
                <size
                    android:height="48dp"
                    android:width="48dp" />

                <gradient
                    android:centerColor="#80ec7e2a"
                    android:centerY="0.5"
                    android:endColor="#ffec7e2a"
                    android:startColor="#00ec7e2a"
                    android:type="sweep"
                    android:useLevel="false" />
            </shape>

        </rotate>

örneklem: resim açıklamasını buraya girin


Bu, varsayılandan tamamen farklı (kötü görünümlü) bir animasyon gösterir.
Ixx

18

Varsayılan ilerleme çubuğunun görünümünü / hissini değiştirmeye çalışırken aynı sorunu kullanın. İşte umarım insanlara yardımcı olacak daha fazla bilgi :)

  • Xml dosyasının adı yalnızca karakter içermelidir: a-z0-9_.(yani büyük harf kullanılmaz!)
  • "Çekilebilir" referansınız R.drawable.filename
  • Varsayılan görünüm, kullanmak geçersiz kılmak için myProgressBar.setProgressDrawable(...), ancak tıpkı özel düzeni başvuramaz gerekmez R.drawable.filename, bir şekilde tekrar almam gerekiyor Drawable:
    Resources res = getResources();
    myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
  • İlerleme / ikincil ilerleme / maks'i ayarlamadan önce stil ayarlamanız gerekir (daha sonra benim için 'boş' bir ilerleme çubuğuyla sonuçlandı)

15

Muhtemelen bu cevapta bahsedilmeyen bir şey var:

Temanızın devralmasını ise Theme.AppCompat, ProgressBarsen olarak tanımlanan renk üstlenecek"colorAccent" sizin tema.

Yani, kullanarak ..

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

ProgressBar öğesinin rengini otomatik olarak @color/custom_color.


1
<İtem name = "android: colorAccent"> @ renk / vurgu </item> kullanmam gerekiyordu
tonisives


15

Stillerinizi, Temalarınızı değiştirmeyi veya android'i kullanmayı deneyebilirsiniz: indeterminateTint = "@ color / yourColor" istediğiniz herhangi bir yerde, ancak herhangi bir Android SKD sürümünde çalışacak tek bir yol var:

İlerleme çubuğu belirsiz değilse, lütfen şunu kullanın:

progressBar.getProgressDrawable().setColorFilter(ContextCompat.getColor(context, R.color.yourColor), PorterDuff.Mode.SRC_IN );

İlerleme çubuğu belirsizse, lütfen şunu kullanın:

progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), R.color.yourColor), PorterDuff.Mode.SRC_IN );

Android'in bu kadar dağınık olması üzücü!


Teşekkürler! Belirsiz olarak çalışır ProgressBar, ancak belirlemek için tüm ölçeği renkle boyar.
CoolMind

14

Yatay ProgressBar'da nasıl yaptım:

    LayerDrawable layerDrawable = (LayerDrawable) progressBar.getProgressDrawable();
    Drawable progressDrawable = layerDrawable.findDrawableByLayerId(android.R.id.progress);
    progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);

2
Aynı şeyi, artı arka plan renk değişikliğini yaptım: layerDrawable.findDrawableByLayerId (android.R.id.background) .setColorFilter (trackColor, PorterDuff.Mode.SRC);
Kamen Dobrev

1
@KamenDobrev'in yorumu ile birlikte bu cevap aslında istediğimi yaptı. İlerlemek için sadece bir renk filtresi ayarladığımda arka plan rengi de değişti.
m_katsifarakis

13

Düzen xml dosyasındaki rengi değiştirmek istiyorsanız, aşağıdaki kodu kullanın ve istediğiniz renk için indeterminateTint özelliğini kullanın .

    <ProgressBar
      android:id="@+id/progressBar"
      style="?android:attr/progressBarStyle"
      android:layout_width="wrap_content"
      android:indeterminate="true"
      android:indeterminateTintMode="src_atop"
      android:indeterminateTint="#ddbd4e"
      android:layout_height="wrap_content"
      android:layout_marginBottom="20dp"
      android:layout_alignParentBottom="true"
      android:layout_centerHorizontal="true" />

12

Bu çözüm benim için çalıştı:

<style name="Progressbar.White" parent="AppTheme">
    <item name="colorControlActivated">@color/white</item>
</style>

<ProgressBar
    android:layout_width="@dimen/d_40"
    android:layout_height="@dimen/d_40"
    android:indeterminate="true"
    android:theme="@style/Progressbar.White"/>

8

Bir küçük şey daha, bir temel temayı miras alırsanız tema çözümü işe yarıyor, bu yüzden uygulama kompakt için temanız şöyle olmalıdır:

<style name="AppTheme.Custom" parent="@style/Theme.AppCompat">
    <item name="colorAccent">@color/custom</item>
</style>

Ve bunu ilerleme çubuğu temasında ayarlayın

<ProgressBar
    android:id="@+id/progressCircle_progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:theme="@style/AppTheme.Custom"
    android:indeterminate="true"/>

7

Yatay ProgressBar rengini değiştirmek için (kotlin'de):

fun tintHorizontalProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.progressTintList = ColorStateList.valueOf(color)
    } else{
        val layerDrawable = progress.progressDrawable as? LayerDrawable
        val progressDrawable = layerDrawable?.findDrawableByLayerId(android.R.id.progress)
        progressDrawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    }
}

Belirsiz ProgressBar rengini değiştirmek için:

fun tintIndeterminateProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.indeterminateTintList = ColorStateList.valueOf(color)
    } else {
        (progress.indeterminateDrawable as? LayerDrawable)?.apply {
            if (numberOfLayers >= 2) {
                setId(0, android.R.id.progress)
                setId(1, android.R.id.secondaryProgress)
                val progressDrawable = findDrawableByLayerId(android.R.id.progress).mutate()
                progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
            }
        }
    }
}

Ve nihayet normalde lolipop öncesi ilerlemeyi renklendirir

api 19 renkli ilerleme


6

Yatay ilerleme çubuğu özel malzeme tarzı:

Arka plan rengini ve yatay ilerleme çubuğunun ilerlemesini değiştirmek için.

<style name="MyProgressBar" parent="@style/Widget.AppCompat.ProgressBar.Horizontal">
    <item name="android:progressBackgroundTint">#69f0ae</item>
    <item name="android:progressTint">#b71c1c</item>
    <item name="android:minWidth">200dp</item>
</style>

Stil özelliğini ayarlayarak ilerleme çubuğuna uygulayın, özel malzeme stilleri ve özel ilerleme çubuğu kontrolü için http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples


3
bu minimum api seviyesi 21 gerektirir
Shihab Uddin

6

PaulieG'nin cevabı hakkında bilgi eklemek için gönderildi , çünkü ateiob bir şeyi açıklamamı istedi ...


ProgressBarİlerlemeyi bir değere ayarlamak için bir girişimi göz ardı eden bir hata / sorun / optimizasyon olduğunu söyleyebilirim (veya en azından, Android kaynak kodunun şu anki sürümüne bakarken yazarken) zaten.

  • örneğin progress = 45 ise ve 45 olarak ayarlamaya çalışırsanız, kod hiçbir şey yapmaz ve ilerlemeyi yeniden çizmez .

Aradıktan sonra ProgressBar.setProgressDrawable(), ilerleme çubuğunuz boş olacaktır (çünkü çekilebilir kısmı değiştirdiniz).

Bu, ilerlemeyi ayarlamanız ve yeniden çizmeniz gerektiği anlamına gelir. Ancak ilerlemeyi korunmuş bir değere ayarlarsanız, hiçbir şey yapmaz.

Önce 0'a, sonra tekrar "eski" değerine ayarlamanız gerekir; çubuk yeniden çizilir.


Özetlemek gerekirse:

  • "eski" ilerleme değerini koru
  • çizilebilir / rengi güncelle (çubuğu boş bırakır)
  • ilerlemeyi 0'a sıfırlayın (aksi takdirde sonraki satır hiçbir şey yapmaz)
  • ilerlemeyi "eski" değere sıfırla (düzeltme çubuğu)
  • geçersiz kılmak

Aşağıda bunu yapan bir yöntem var:

protected void onResume()
{
    super.onResume();
    progBar = (ProgressBar) findViewById(R.id.progress_base);

    int oldProgress = progBar.getProgress();

    // define new drawable/colour
    final float[] roundedCorners = new float[]
        { 5, 5, 5, 5, 5, 5, 5, 5 };
    ShapeDrawable shape = new ShapeDrawable(new RoundRectShape(
        roundedCorners, null, null));
    String MyColor = "#FF00FF";
    shape.getPaint().setColor(Color.parseColor(MyColor));
    ClipDrawable clip = new ClipDrawable(shape, Gravity.LEFT,
        ClipDrawable.HORIZONTAL);
    progBar.setProgressDrawable(clip);

    progBar.setBackgroundDrawable(getResources().getDrawable(
        android.R.drawable.progress_horizontal));

    // work around: setProgress() ignores a change to the same value
    progBar.setProgress(0);
    progBar.setProgress(oldProgress);

    progBar.invalidate();
}

HappyEngineer çözüm kadar, benzer bir geçici çözüm olduğunu düşünüyorum, "ilerleme" ofset el ile ayarlamak için. Her iki durumda da, yukarıdaki kod sizin için çalışmalıdır.


Teşekkürler ... bu gerçekten çalışır ... ama benim çekilebilir statik (kaynaklardan) olduğu gibi ... işe yaramadı. Yalnızca "drawable.invalidateSelf ();" i ekledikten sonra çalıştı 'setProgress (0)' ve 'setProgressDrawable (çekilebilir)' dan önce
Alécio Carvalho


5

sadece kullanın:

PorterDuff.Mode mode = PorterDuff.Mode.SRC_IN;
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
    mode = PorterDuff.Mode.MULTIPLY;
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
    progressBar.setProgressBackgroundTintList(ColorStateList.valueOf(Color.RED));
} else {
    Drawable progressDrawable;
    progressDrawable = (progressBar.isIndeterminate() ? progressBar.getIndeterminateDrawable() : progressBar.getProgressDrawable()).mutate();
    progressDrawable.setColorFilter(context.getResources().getColor(Color.RED), mode);
    progressBar.setProgressDrawable(progressDrawable);
}

4

ProgressBar yatay bir stil için kullanıyorum:

import android.widget.ProgressBar;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.ClipDrawable;
import android.view.Gravity;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;

public void setColours(ProgressBar progressBar,
                        int bgCol1, int bgCol2, 
                        int fg1Col1, int fg1Col2, int value1,
                        int fg2Col1, int fg2Col2, int value2)
  {
    //If solid colours are required for an element, then set
    //that elements Col1 param s the same as its Col2 param
    //(eg fg1Col1 == fg1Col2).

    //fgGradDirection and/or bgGradDirection could be parameters
    //if you require other gradient directions eg LEFT_RIGHT.

    GradientDrawable.Orientation fgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;
    GradientDrawable.Orientation bgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;

    //Background
    GradientDrawable bgGradDrawable = new GradientDrawable(
            bgGradDirection, new int[]{bgCol1, bgCol2});
    bgGradDrawable.setShape(GradientDrawable.RECTANGLE);
    bgGradDrawable.setCornerRadius(5);
    ClipDrawable bgclip = new ClipDrawable(
            bgGradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);     
    bgclip.setLevel(10000);

    //SecondaryProgress
    GradientDrawable fg2GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg2Col1, fg2Col2});
    fg2GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg2GradDrawable.setCornerRadius(5);
    ClipDrawable fg2clip = new ClipDrawable(
            fg2GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Progress
    GradientDrawable fg1GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg1Col1, fg1Col2});
    fg1GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg1GradDrawable.setCornerRadius(5);
    ClipDrawable fg1clip = new ClipDrawable(
            fg1GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Setup LayerDrawable and assign to progressBar
    Drawable[] progressDrawables = {bgclip, fg2clip, fg1clip};
    LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);     
    progressLayerDrawable.setId(0, android.R.id.background);
    progressLayerDrawable.setId(1, android.R.id.secondaryProgress);
    progressLayerDrawable.setId(2, android.R.id.progress);

    //Copy the existing ProgressDrawable bounds to the new one.
    Rect bounds = progressBar.getProgressDrawable().getBounds();
    progressBar.setProgressDrawable(progressLayerDrawable);     
    progressBar.getProgressDrawable().setBounds(bounds);

    // setProgress() ignores a change to the same value, so:
    if (value1 == 0)
        progressBar.setProgress(1);
    else
        progressBar.setProgress(0);
    progressBar.setProgress(value1);

    // setSecondaryProgress() ignores a change to the same value, so:
    if (value2 == 0)
        progressBar.setSecondaryProgress(1);
    else
        progressBar.setSecondaryProgress(0);
    progressBar.setSecondaryProgress(value2);

    //now force a redraw
    progressBar.invalidate();
  }

Örnek bir çağrı şöyle olabilir:

  setColours(myProgressBar, 
          0xff303030,   //bgCol1  grey 
          0xff909090,   //bgCol2  lighter grey 
          0xff0000FF,   //fg1Col1 blue 
          0xffFFFFFF,   //fg1Col2 white
          50,           //value1
          0xffFF0000,   //fg2Col1 red 
          0xffFFFFFF,   //fg2Col2 white
          75);          //value2

'İkincil ilerlemeye' ihtiyacınız yoksa, value2 değerini value1 olarak ayarlayın.


4

Bu özel stili ilerleme çubuğuna uygulayın.

<style name="customProgress" parent="@android:style/Widget.ProgressBar.Small">
        <item name="android:indeterminateDrawable">@drawable/progress</item>
        <item name="android:duration">40</item>
        <item name="android:animationCache">true</item>
        <item name="android:drawingCacheQuality">low</item>
        <item name="android:persistentDrawingCache">animation</item>
    </style>

@ drawable / progress.xml -

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/spinner_white"
    android:pivotX="50%"
    android:pivotY="50%" />

İlerleme çubuğu için bu tür görüntüleri kullanın. resim açıklamasını buraya girin

Daha iyi sonuç için birden çok ilerleme görüntüsü kullanabilirsiniz. Ve lütfen görüntüleri kullanmaktan çekinmeyin, çünkü Android Platformunun kendisi ilerleme çubuğu için görüntüleri kullanıyor. Kod sdk'den ayıklanır :)


4

Muhammed-Adil'e göre SDK ver 21 ve üstü için önerilen

android:indeterminateTint="@color/orange"

XML Works'te benim için yeterince kolaydır.


Tüm uygulama için değiştirmek isterseniz, lütfen <color name = "RedAccent"> # FE6C27 </color> değerini değiştirin. Değerler / colors.xml dosyasında.
mughil

4

ProgressBar'ın rengini programlı olarak değiştirmek için kod.

ProgressBar progressBar = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
progressBar.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));

4
ProgressBar freeRamPb = findViewById(R.id.free_ram_progress_bar);

freeRamPb.getProgressDrawable().setColorFilter(
Color.BLUE, android.graphics.PorterDuff.Mode.SRC_IN);

Muhteşem. Hızlı ve etkili çözüm. Teşekkürler!
Tobias Reich
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.