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


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

Я хотел бы изменить цвет прогресс-желтый.

<ProgressBar 
    android:id="@+id/progressbar" 
    android:layout_width="80dip" 
    android:layout_height="20dip"  
    android:focusable="false" 
    style="?android:attr/progressBarStyleHorizontal" />

проблема в том, что цвет прогресса отличается в разных устройствах. Итак, я хочу, чтобы он исправил цвет прогресса.

12 136

12 ответов:

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

<ProgressBar
    android:id="@+id/ProgressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:indeterminate="false"
    android:maxHeight="10dip"
    android:minHeight="10dip"
    android:progress="50"
    android:progressDrawable="@drawable/greenprogress" />

затем создайте новый drawable с чем-то похожим на следующее (В данном случае greenprogress.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>
        <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="#33FF33"
                android:endColor="#008000"
                android:angle="270" />
        </shape>
    </clip>
</item>

</layer-list>

Вы можете изменить цвет по мере необходимости, это даст вам зеленый прогресс-бар.

более простое решение:

progress_drawable_blue

<?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="@color/disabled" />
    </shape>
</item>

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

</layer-list>

Если вы хотите только изменить цвет индикатора выполнения, вы можете просто использовать цветовой фильтр в методе onCreate () вашего действия:

ProgressBar progressbar = (ProgressBar) findViewById(R.id.progressbar);
int color = 0xFF00FF00;
progressbar.getIndeterminateDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
progressbar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);

идея здесь.

вам нужно сделать это только для предварительных версий lollipop. На Lollipop вы можете использовать атрибут стиля colorAccent.

просто Создайте стиль в values/styles.xml.

<style name="ProgressBarStyle">
    <item name="colorAccent">@color/greenLight</item>
</style>

затем установите этот стиль как ваш ProgressBar тема.

<ProgressBar
    android:theme="@style/ProgressBarStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

и не имеет значения, ваш индикатор выполнения является горизонтальным или круговым. Вот и все.

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

android:progressBackgroundTint="@color/yourBackgroundColor"
android:progressTint="@color/yourColor"

есть 3 способа решить этот вопрос:

  1. как настроить цвет progressbar декларативно
  2. как настроить цвет progressbar программно, но выбрать цвет из различных предопределенных цветов, объявленных до времени компиляции
  3. как настроить цвет progressbar программно, а также создать цвет программно.

в частности, существует много путаницы вокруг #2 и #3, Как видно в комментарии к ответу amfcosta. Этот ответ приведет к непредсказуемым цветовым результатам в любое время, когда вы хотите установить progressbar на что-либо, кроме основных цветов, поскольку он только изменяет цвет фона, а фактическая область "клипа" индикатора выполнения по-прежнему будет желтым наложением с уменьшенной непрозрачностью. Например, использование этого метода для установки фона на темно-фиолетовый приведет к появлению индикатора выполнения "клип" цвета какого-то сумасшедшего розоватого цвета в результате темно-фиолетового и желтого смешивания с помощью уменьшенного альфа.

так или иначе, #1 отлично отвечает Райан и Штарке отвечает на большинство #3, но для тех, кто ищет полное решение #2 и #3:


как настроить цвет progressbar программно, но выбрать цвет из заданного цвета, объявленного в XML

res/drawable / my_progressbar.xml:

создайте этот файл, но измените цвета в my_progress и my_secondsProgress:

(Примечание: это это просто копия фактического XML-файла, определяющего по умолчанию Android SDK ProgressBar, но я изменил идентификаторы и цвета. Оригинал называется progress_horizontal)

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@+id/my_progress_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="@+id/my_secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient
                android:startColor="#80ff171d"
                android:centerColor="#80ff1315"
                android:centerY="0.75"
                android:endColor="#a0ff0208"
                android:angle="270"
                />
        </shape>
    </clip>
</item>

<item android:id="@+id/my_progress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient
                android:startColor="#7d2afdff"
                android:centerColor="#ff2afdff"
                android:centerY="0.75"
                android:endColor="#ff22b9ba"
                android:angle="270"
                />
        </shape>
    </clip>
</item>

в вашем Java:

final Drawable drawable;
int sdk = android.os.Build.VERSION.SDK_INT;
    if(sdk < 16) {
        drawable =  ctx.getResources().getDrawable(R.drawable.my_progressbar);
    } else {
        drawable = ContextCompat.getDrawable(ctx, R.drawable.my_progressbar);
    }
progressBar.setProgressDrawable(drawable)

Как настроить цвет progressbar программно, а также создать цвет программно

EDIT: я нашел время, чтобы решить эту проблему должным образом. Мой прежний ответ оставил это немного неоднозначный.

ProgressBar состоит из 3 Drawables в LayerDrawable.

  1. слой 1-фон
  2. слой 2 является вторичным цветом прогресса
  3. слой 3-это основной цвет индикатора выполнения

в приведенном ниже примере я изменю цвет основного индикатора выполнения на голубой.

//Create new ClipDrawable to replace the old one
float pxCornerRadius = viewUtils.convertDpToPixel(5);
final float[] roundedCorners = new float[] { pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius };
ShapeDrawable shpDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null, null));
shpDrawable.getPaint().setColor(Color.CYAN);
final ClipDrawable newProgressClip = new ClipDrawable(shpDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);

//Replace the existing ClipDrawable with this new one
final LayerDrawable layers = (LayerDrawable) progressBar.getProgressDrawable();
layers.setDrawableByLayerId(R.id.my_progress, newProgressClip);

этот пример устанавливает его в сплошной цвет. Вы можете установить его в градиентный цвет с помощью замена

shpDrawable.getPaint().setColor(Color.CYAN);

С

Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
shpDrawable.getPaint().setShader(shader);

ваше здоровье.

-Ланс

самое простое решение я нашел-это что-то вроде этого:

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

поставить выше в под .

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

API 21 или выше

для тех, кто ищет, как сделать это программно:

    Drawable bckgrndDr = new ColorDrawable(Color.RED);
    Drawable secProgressDr = new ColorDrawable(Color.GRAY);
    Drawable progressDr = new ScaleDrawable(new ColorDrawable(Color.BLUE), Gravity.LEFT, 1, -1);
    LayerDrawable resultDr = new LayerDrawable(new Drawable[] { bckgrndDr, secProgressDr, progressDr });
    //setting ids is important
    resultDr.setId(0, android.R.id.background);
    resultDr.setId(1, android.R.id.secondaryProgress);
    resultDr.setId(2, android.R.id.progress);

установка идентификаторов для drawables имеет решающее значение и заботится о сохранении границ и фактического состояния индикатора выполнения

цвет ProgressBar можно изменить следующим образом:

/ res / values / colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorAccent">#FF4081</color>
</resources>

/ res / values / styles.xml

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

onCreate:

progressBar = (ProgressBar) findViewById(R.id.progressBar);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    Drawable drawable = progressBar.getIndeterminateDrawable().mutate();
    drawable.setColorFilter(ContextCompat.getColor(this, R.color.colorAccent), PorterDuff.Mode.SRC_IN);
    progressBar.setIndeterminateDrawable(drawable);
}

final LayerDrawable layers = (LayerDrawable) progressBar.getProgressDrawable(); слои.getDrawable(2).setColorFilter (цвет, PorterDuff.Режим.SRC_IN);

выше ответы изменить весь цвет фона, и это двусмысленности, что это изменить высоту индикатора выполнения до очень макс.который невозможно изменить в xml. лучший способ изменить только статус индикатора выполнения, что сколько завершено i.s 20% красный цвет, 50% желтый цвет 70% и выше зеленый цвет. вы можете сделать это программно в Java.

поделитесь своим ответом, если у вас есть какое-либо другое решение.