Вопрос по colors, android, progress-bar – Изменить цвет индикатора выполнения только через CODE в Android

40

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

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

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

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

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

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

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

Ваш Ответ

11   ответов
24

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

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);
Большое спасибо за этот потрясающий ответ
@Franco setTint - это API 21+, чтобы быть в курсе. .setColorFilter, кажется, работает на 16+ в моем тестировании.
Единственный способ, который работал и не подкрашивал фон !!
Я использовал это решение, но сDrawableCompat.setTint() вместоsetColorFilter() и это сработало отлично. Это единственный способ, который я нашел, чтобы цвет фона также не менялся.
3

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

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

Нет, программное решение будет окрашивать оба цвета фона + переднего плана ...
1

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

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

7

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

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

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

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

Update

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

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

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

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

 mainProgressBar.getIndeterminateDrawable().setColorFilter(Color.GREEN, PorterDuff.Mode.MULTIPLY);   
это работало на меня, хотя!
не работал для меня
19

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

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

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

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

почти работает, но если вы измените высоту индикатора выполнения, фон для рисования будет слишком высоким
41

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

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

<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 имеют разные цвета.

2

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

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

Похожие вопросы