Как изменить цвет индикатора выполнения в Android

StackOverflow https://stackoverflow.com/questions/2020882

  •  19-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Мне жаль, что это не ответ, но что движет требованием, устанавливающим его из кода?И .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>

Другие советы

Для горизонтальной панели прогресса вы можете использовать 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

Это не программно, но я думаю, что в любом случае это могло бы помочь многим людям.
Я много пробовал, и самым эффективным способом было добавить эти строки в мою панель прогресса в файле .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+

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

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

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

Это старый вопрос, но использование theme здесь не упоминается.Если ваша тема по умолчанию использует 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

Весь 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"/>

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

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

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

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

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

если Неопределенный:

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

В настоящее время, в 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);
}

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

Это то, что я сделал.Сработало.

Панель прогресса:

<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:
Здесь используйте градиент, чтобы изменить цвет по своему усмотрению.И Android: toDegrees="X" увеличивает значение X, и панель прогресса быстро вращается.Уменьшите, и он медленно вращается.Настройте в соответствии с вашими потребностями.

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

образец: enter image description here

Столкнулся с той же проблемой во время работы над изменением внешнего вида индикатора выполнения по умолчанию.Вот еще немного информации, которая, надеюсь, поможет людям :)

  • Имя xml-файла должно содержать только символы: a-z0-9_. (то есть.никаких заглавных букв!)
  • Чтобы сослаться на ваш "drawable", это R.drawable.filename
  • Чтобы переопределить внешний вид по умолчанию, вы используете myProgressBar.setProgressDrawable(...), однако вам нужно не может просто ссылаться на ваш пользовательский макет как R.drawable.filename, вам нужно извлечь его как Drawable:
    Resources res = getResources();
    myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
    
  • Вам нужно установить стиль перед настройкой прогресса / вторичного прогресса / максимального (последующая установка этого параметра для меня привела к появлению "пустого" индикатора выполнения)

Вероятно, есть одна вещь, которая не была упомянута в этом ответе:

Если ваша тема наследуется от Theme.AppCompat, ProgressBar примет цвет, который вы определили как "colorAccent" в вашей теме.

Итак, используя..

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

..автоматически изменит цвет панели выполнения в соответствии с @color/custom_color .

Как я сделал это в горизонтальной панели прогресса:

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

Вы можете попробовать изменить свои стили, темы или использовать Android: indeterminateTint="@color /yourColor" в любом месте, где захотите, но есть только один способ сделать это, который будет работать на любой версии Android SKD:

Если ваш индикатор выполнения не является неопределенным, пожалуйста, используйте:

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

Если ваш индикатор выполнения не определен, пожалуйста, используйте:

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

Печально, что Android - это такой беспорядок!

android:progressTint="#ffffff" 

Простейшее решение если вы хотите изменить цвет в XML-файле layout, используйте приведенный ниже код и используйте Неопределенное значение свойство для вашего желаемого цвета.

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

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

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

Еще одна мелочь, решение темы действительно работает, если вы наследуете базовую тему, поэтому для app compact ваша тема должна быть:

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

А затем установите это в теме индикатора выполнения

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

Опубликовано для добавления информации о Ответ ПаулигА, поскольку ateiob попросил меня кое-что объяснить...


Я могу сказать, что есть (или, по крайней мере, была на момент написания статьи, когда я просматривал текущую версию исходного кода Android) ошибка / проблема / оптимизация в ProgressBar код, который игнорирует попытку присвоить прогрессу значение, на котором он уже находится.

  • т. е.если progress = 45, и вы пытаетесь установить его равным 45, код ничего не сделает, и не будет перерисовывать ход выполнения.

После вызова ProgressBar.setProgressDrawable(), ваш индикатор выполнения будет пустым (потому что вы изменили прорисовываемую часть).

Это означает, что вам нужно установить ход выполнения и перерисовать его.Но если вы просто установите для прогресса сохраненное значение, это ничего не даст.

Сначала вы должны установить его в 0, затем снова в "старое" значение, и полоса будет перерисована.


Итак, чтобы подвести итог:

  • сохраните "старое" значение прогресса
  • обновите объект рисования / цвет (делает панель пустой)
  • сбросьте прогресс на 0 (в противном случае следующая строка ничего не делает)
  • сбросьте прогресс до "старого" значения (исправлена панель)
  • признать недействительным

Ниже приведен метод, который у меня есть, который делает это:

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, я думаю, что это был аналогичный обходной путь, чтобы вручную установить смещение "прогресса".В любом случае, приведенный выше код должен работать на вас.

Используйте android.поддержка.версия 4.графика.с возможностью рисования.DrawableCompat:

            Drawable progressDrawable = progressBar.getIndeterminateDrawable();
            if (progressDrawable  != null) {
                Drawable mutateDrawable = progressDrawable.mutate();
                DrawableCompat.setTint(mutateDrawable, primaryColor);
                progressBar.setProgressDrawable(mutateDrawable);
            }

Для панели прогресса в горизонтальном стиле я использую:

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

Примером вызова может быть:

  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

Если вам не нужен "вторичный прогресс", просто установите значение2 в значение1.

Примените этот пользовательский стиль к индикатору выполнения.

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

Используйте этот тип изображения для индикатора выполнения.enter image description here

Для лучшего результата вы можете использовать несколько изображений прогресса.И, пожалуйста, не стесняйтесь использовать изображения, потому что сама платформа Android использует изображения для progressbar.Код извлечен из sdk :)

Вот код для изменения цвета панели выполнения программным путем.

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

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

private Handler progressBarHandler = new Handler();

GradientDrawable progressGradientDrawable = new GradientDrawable(
        GradientDrawable.Orientation.LEFT_RIGHT, new int[]{
                0xff1e90ff,0xff006ab6,0xff367ba8});
ClipDrawable progressClipDrawable = new ClipDrawable(
        progressGradientDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
Drawable[] progressDrawables = {
        new ColorDrawable(0xffffffff),
        progressClipDrawable, progressClipDrawable};
LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);


int status = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // TODO Auto-generated method stub
    setContentView(R.layout.startup);

    bar = (ProgressBar) findViewById(R.id.start_page_progressBar);
    bar.setProgress(0);
    bar.setMax(100);

    progressLayerDrawable.setId(0, android.R.id.background);
    progressLayerDrawable.setId(1, android.R.id.secondaryProgress);
    progressLayerDrawable.setId(2, android.R.id.progress);

    bar.setProgressDrawable(progressLayerDrawable);
}

Это помогло мне установить пользовательский цвет для progressbar с помощью кода.Надеюсь, это поможет

Согласно предложению Мухаммеда-Адиля для SDK версии 21 и выше

android:indeterminateTint="@color/orange"

в XML Работает для меня, это достаточно просто.

Это так просто с помощью attr , если вы имеете дело с мультистильными приложениями:

попробуйте этот способ:

Объявите приведенный ниже атрибут attrs.xml

 <attr name="circularProgressTheme" format="reference"></attr>

Вставьте приведенный ниже код в styles.xml

 <style name="ProgressThemeWhite" parent="ThemeOverlay.AppCompat.Light">
        <item name="colorAccent">#FF0000</item>
    </style>

    <style name="circularProgressThemeWhite">
        <item name="android:theme">@style/ProgressThemeWhite</item>
    </style>


  <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

   <item name="circularProgressTheme">@style/circularProgressThemeWhite</item>

 </style>

используйте индикатор выполнения, как показано ниже

  <ProgressBar
        style="?attr/circularProgressTheme"
        android:id="@+id/commonProgress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:visibility="visible"/>

Пользовательский стиль материала горизонтального индикатора выполнения :

Чтобы изменить цвет фона и ход горизонтальной полосы выполнения.

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

Примените его к индикатору выполнения, установив атрибут style для пользовательских стилей материалов и проверки пользовательского индикатора выполнения http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples

Чтобы изменить цвет горизонтальной панели прогресса (в kotlin):

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

Чтобы изменить неопределенный цвет панели выполнения:

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

И это, наконец, нормально подкрашивает прогрессбары перед lollipop

tinted progress on api 19

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top