Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

Для горизонтального 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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

В настоящее время в 2016 году я обнаружил, что некоторые устройства pre-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);
}

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

Ответ 11

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

Индикатор:

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

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

Ответ 12

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

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

Ответ 13

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

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

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

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

.. автоматически изменит цвет ProgressBar на @color/custom_color.

Ответ 14

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

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

Ответ 15

Вы можете попробовать изменить свои стили, темы или использовать андроид: 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 такой беспорядок!

Ответ 16

android:progressTint="#ffffff" 

Ответ 17

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

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

Ответ 18

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

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

Ответ 19

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

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

Ответ 20

Написал, чтобы добавить информацию об ответе PaulieG, так как ateiob попросил меня кое-что объяснить...


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

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

Ответ 21

Используйте android.support.v4.graphics.drawable.DrawableCompat:

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

Ответ 22

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

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.

Ответ 23

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

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

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

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

Ответ 24

В соответствии с предложенным Мухаммадом-адилом для SDK версии 21 и выше

android:indeterminateTint="@color/orange"

в XML Работает для меня, достаточно легко.

Ответ 25

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

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

Ответ 26

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

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

Ответ 27

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

Это помогло мне настроить собственный цвет, чтобы перейти через код. Надеюсь, что это поможет.

Ответ 28

Это так просто, используя 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"/>

Ответ 29

Горизонтальный стиль выполнения пользовательских материалов:

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

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

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

Ответ 30

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

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

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

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

И это, наконец, нормально подкрасить прогресс леденец на палочке

tinted progress on api 19