Как изменить цвет индикатора выполнения в Android - PullRequest
402 голосов
/ 07 января 2010

Я использую горизонтальный индикатор выполнения в своем приложении для Android и хочу изменить его цвет выполнения (по умолчанию желтый). Как я могу сделать это, используя code (не XML)?

Ответы [ 31 ]

442 голосов
/ 04 апреля 2013

Для горизонтальной панели ProgressBar вы также можете использовать ColorFilter, например:

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

Red ProgressBar using color filter

Примечание: Это изменяет внешний вид всех индикаторов выполнения в вашем приложении. Чтобы изменить только один конкретный индикатор выполнения, сделайте следующее:

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

Если progressBar не определен, тогда используйте getIndeterminateDrawable() вместо getProgressDrawable().

Начиная с Lollipop (API 21), вы можете установить оттенок прогресса:

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

Red ProgressBar using progress tint

268 голосов
/ 07 января 2010

Извините, что это не ответ, но что движет требованием установить его из кода? И .setProgressDrawable должен работать, если он определен правильно

<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>
266 голосов
/ 11 июля 2015

Это не программно, но я думаю, что в любом случае это может помочь многим людям.
Я много пробовал, и самым эффективным способом было добавить эти строки в мой ProgressBar в файле .xml:

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

В итоге этот код сделал это для меня:

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

Это решение работает для API 21 +

218 голосов
/ 07 июня 2012

Для моего неопределенного индикатора выполнения (счетчик) я просто установил цветной фильтр на рисование. Отлично работает и всего одна строчка.

Пример, где установка цвета на красный:

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

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

enter image description here

162 голосов
/ 09 июля 2016

Это старый вопрос, но использование темы здесь не упоминается. Если ваша тема по умолчанию использует AppCompat, цвет вашего ProgressBar будет colorAccent, который вы определили.

Изменение colorAccent также изменит цвет вашего ProgressBar, но изменения также отражаются в нескольких местах. Итак, если вы хотите другой цвет только для определенного PregressBar, вы можете сделать это, применив тему к этому ProgressBar:

  • Расширение темы по умолчанию и переопределение colorAccent

    <style name="AppTheme.WhiteAccent">
        <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
    </style>
    
  • А в ProgressBar добавить атрибут android:theme:

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

Так это будет выглядеть примерно так:

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

То есть вы просто меняете colorAccent для вашего конкретного ProgressBar.

Примечание : Использование style не будет работать. Вам нужно использовать только android:theme. Вы можете найти больше использования темы здесь: https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH

35 голосов
/ 24 сентября 2018

Все API

если использовать все API, просто создайте тему в стиле

style.xml

<resources>

    //...

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

</resources>

и используется в процессе

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

API уровня 21 и выше

если используется в API уровня 21 и выше, просто используйте этот код:

<ProgressBar
   //...
   android:indeterminate="true"
   android:indeterminateTintMode="src_atop"
   android:indeterminateTint="@color/secondary"/>
34 голосов
/ 06 марта 2011

В соответствии с некоторыми предложениями, вы МОЖЕТЕ указать форму и закрепить клип с цветом, а затем установить его. У меня это работает программно. Вот как я это делаю ..

Сначала убедитесь, что вы импортировали библиотеку для рисования ..

import android.graphics.drawable.*;

Затем используйте код, аналогичный приведенному ниже;

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);
28 голосов
/ 06 июля 2017

Это сработало для меня:

<ProgressBar
 android:indeterminateTint="#d60909"
 ... />
26 голосов
/ 22 марта 2015

если неопределено:

((ProgressBar)findViewById(R.id.progressBar))
    .getIndeterminateDrawable()
    .setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
22 голосов
/ 14 сентября 2016

В настоящее время в 2016 году я обнаружил, что некоторые устройства до Lollipop не поддерживают настройку colorAccent, поэтому мое окончательное решение для всех API теперь выглядит следующим образом:

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

Для бонусных баллов не используется устаревший код. Попробуй!

...