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

У меня есть progressBar, использующий класс ProgressBar.

Просто делаю это:

progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);

Мне нужно изменить цвет этого, используя входное значение следующим образом:

int color = "red in RGB value".progressBar.setColor(color)

или что-то типа того...

Я не могу использоватьXML layout потому что индикатор выполнения настраивается для пользователей.

Ответы на вопрос(11)

если вам нужно подкрасить фон и индикатор выполнения в разные цвета.

progress_drawable.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 android:shape="rectangle" >
            <solid android:color="@color/white" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <solid android:color="@color/green" />
            </shape>
        </clip>
    </item>
</layer-list>

Можно программным образом декомпоновать элементы списка слоев и подкрасить их отдельно:

LayerDrawable progressBarDrawable = (LayerDrawable) progressBar.getProgressDrawable();
Drawable backgroundDrawable = progressBarDrawable.getDrawable(0);
Drawable progressDrawable = progressBarDrawable.getDrawable(1);

backgroundDrawable.setColorFilter(ContextCompat.getColor(this.getContext(), R.color.white), PorterDuff.Mode.SRC_IN);
progressDrawable.setColorFilter(ContextCompat.getColor(this.getContext(), R.color.red), PorterDuff.Mode.SRC_IN);
 01 мар. 2019 г., 02:36
Большое спасибо за этот потрясающий ответ
 17 апр. 2018 г., 20:38
@Franco setTint - это API 21+, чтобы быть в курсе. .setColorFilter, кажется, работает на 16+ в моем тестировании.
 30 апр. 2018 г., 12:22
Единственный способ, который работал и не подкрашивал фон !!
 25 окт. 2017 г., 01:50
Я использовал это решение, но сDrawableCompat.setTint() вместоsetColorFilter() и это сработало отлично. Это единственный способ, который я нашел, чтобы цвет фона также не менялся.

default color вxml отdrawable.

Я изменил это программно.

activity_splasg.xml:

<ProgressBar
       android:id="@+id/splashProgressBar"
       android:progressDrawable="@drawable/splash_progress_drawable"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:max="100"
       android:progress="50"
       style="?android:attr/progressBarStyleHorizontal"
       android:layout_alignParentBottom="true" />

splash_progress_drawable.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>
            <solid
                android:color="@android:color/transparent" />
        </shape>
    </item>

    <item
        android:id="@android:id/progress">
        <clip>
            <shape>
                <solid
                    android:color="#e5c771" />
            </shape>
        </clip>
    </item>

</layer-list>

Теперь, как изменитьProgressDrawable color programatically.

ProgressBar splashProgressBar = (ProgressBar)findViewById(R.id.splashProgressBar);

Drawable bgDrawable = splashProgressBar.getProgressDrawable();
bgDrawable.setColorFilter(Color.BLUE, android.graphics.PorterDuff.Mode.MULTIPLY);
splashProgressBar.setProgressDrawable(bgDrawable);

Надеюсь, что это поможет вам.

 25 июл. 2016 г., 02:07
Нет, программное решение будет окрашивать оба цвета фона + переднего плана ...

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

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

DrawableCompat.setTint (progressBar.getProgressDrawable (), tintColor);

 19 авг. 2017 г., 13:37
Это работает совершенно нормально! Благодарю. Он автоматически устанавливает значение полного цвета для основного прогресса и прозрачную версию цвета для пути прогресса.
 25 июл. 2016 г., 02:03
Нет, это окрашивает оба фона + цвета переднего плана ...

установив цветной фильтр на отображаемый индикатор выполнения:

Drawable drawable = progressBar.getProgressDrawable();
drawable.setColorFilter(new LightingColorFilter(0xFF000000, customColorInt));
 hico11 июн. 2012 г., 12:32
Вот что я попробовал. Однако, используя этот метод, цвета немного странные ... На самом деле, если я хочу просто иметь цвет: RGB = # 5ea618 с темно-серым цветом фона, что мне делать? Потому что, если, например, я делаю: new LightingColorFilter (0xFF000000, 0xFF5ea618)); Цвет индикатора выполнения - зеленый, но я не вижу, как он движется.
 30 сент. 2016 г., 03:43
окрашивает как фон, так и передний план
 11 июн. 2012 г., 20:55
Если вы хотите получить полный контроль, вы должны создать графику индикатора выполнения самостоятельно.

Update

В более новых версиях Android (21 работает) вы можете программно изменить цвет индикатора выполнения, просто используяsetProgressTintList.

Чтобы установить его красным, используйте:

//bar is a ProgressBar
bar.setProgressTintList(ColorStateList.valueOf(Color.RED));
 09 мая 2017 г., 16:51
Вам может понадобиться позвонитьsetSecondaryProgressTintList и / илиsetIndeterminateTintList в зависимости от того, как вы используете ProgressBar.
 05 мая 2016 г., 17:42
нет, это не работает

то вы копируете этот код, он работает на 100%

 mainProgressBar.getIndeterminateDrawable().setColorFilter(Color.GREEN, PorterDuff.Mode.MULTIPLY);   
 23 окт. 2018 г., 17:02
это работало на меня, хотя!
 19 нояб. 2017 г., 17:30
не работал для меня
Решение Вопроса

но не могу вспомнить ссылку, я публикую свое полное решение, которое отлично подходит для моих нужд:

    // Draw a simple progressBar from xml
    progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);

    // Convert the color (Decimal value) to HEX value: (e.g: #4b96a0)
    String color = colorDecToHex(75, 150, 160);

    // Define a shape with rounded corners
    final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
    ShapeDrawable pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners,     null, null));

    // Sets the progressBar color
    pgDrawable.getPaint().setColor(Color.parseColor(color));

    // Adds the drawable to your progressBar
    ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
    progressBar.setProgressDrawable(progress);

    // Sets a background to have the 3D effect
    progressBar.setBackgroundDrawable(Utils.getActivity().getResources()
            .getDrawable(android.R.drawable.progress_horizontal));

    // Adds your progressBar to your layout
    contentLayout.addView(progressBar);

А вот код для преобразования значений цвета DECIMAL в HEXADECIMAL:

public static String colorDecToHex(int p_red, int p_green, int p_blue)
{
    String red = Integer.toHexString(p_red);
    String green = Integer.toHexString(p_green);
    String blue = Integer.toHexString(p_blue);

    if (red.length() == 1)
    {
        red = "0" + red;
    }
    if (green.length() == 1)
    {
        green = "0" + green;
    }
    if (blue.length() == 1)
    {
        blue = "0" + blue;
    }

    String colorHex = "#" + red + green + blue;
    return colorHex;
}

Я думаю, что последний метод не настолько чист, но он работает хорошо.

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

 03 мая 2016 г., 01:10
почти работает, но если вы измените высоту индикатора выполнения, фон для рисования будет слишком высоким

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

spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000,android.graphics.PorterDuff.Mode.MULTIPLY);
 03 июл. 2016 г., 14:31
Просто быстрое замечание, что это окрашивает как фон + цвета переднего плана, так иgetIndeterminateDrawable() должен быть изменен наgetProgressDrawable() при использовании определенного индикатора выполнения.
 09 дек. 2016 г., 17:05
Есть ли способ просто закрасить передний план с изменением фона?

<ProgressBar
    android:id="@+id/circle_progress_bar_middle"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:max="100"
    android:rotation="-90"
    android:indeterminate="false"
    android:progressDrawable="@drawable/my_drawable_settings2" />

В Java Activity / Fragment:

ProgressBar myProgressBar = (ProgressBar) view.findViewById(R.id.circle_progress_bar_middle);
myProgressBar.setProgressDrawable(getResources().getDrawable(R.my_drawable_settings1));

Файл my_drawable_settings1.xml внутри вашей папки drawable / mipmap:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@android:id/progress">
        <shape
            android:innerRadius="55dp"
            android:shape="ring"
            android:thickness="9dp"
            android:useLevel="true">

            <gradient
                android:startColor="#3594d1"
                android:endColor="@color/white"
                android:type="sweep" />
        </shape>
    </item>
</layer-list>

Где my_drawable_settings1 и my_drawable_settings2.xml имеют разные цвета.

progressbar.setIndeterminateTintList(ColorStateList.valueOf(Color.RED));

Работает только над API 21

Ваш ответ на вопрос