Как динамически изменить цвет индикатора выполнения фона на андроид - PullRequest
10 голосов
/ 03 июня 2011

Я хотел бы динамически изменить цвет фона индикатора выполнения в Android. Я следовал за «бонусной» частью в конце страницы этого урока:

http://colintmiller.com/2010/10/how-to-add-text-over-a-progress-bar-on-android/

Меняет цвет, но только один раз. Если вызывается более одного раза, индикатор выполнения исчезает. Вот код.

Вот определение индикатора выполнения:

<ProgressBar android:id="@+id/progress_bar" android:layout_width="fill_parent"
    android:layout_height="wrap_content" style="@android:style/Widget.ProgressBar.Horizontal"
    android:layout_marginRight="5dp" />

Это определение для рисования в файле res / drawable / green_progress.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="@color/greenStart"
                    android:centerColor="@color/greenMid"
                    android:centerY="0.75"
                    android:endColor="@color/greenEnd"
                    android:angle="270"
            />
        </shape>
    </clip>
</item>

</layer-list>

Ene записи в rex / values ​​/ colors.xml:

<color name="greenStart">#ff33dd44</color>
<color name="greenMid">#ff0A8815</color>
<color name="greenEnd">#ff1da130</color>

И, наконец, в коде:

m_bar.setProgressDrawable(getResources().getDrawable(R.drawable.green_progress));  

Опять же, проблема в том, что он работает в первый раз, но затем заставляет панель исчезнуть.

Ответы [ 2 ]

22 голосов
/ 03 июня 2011

См. Android ProgressBar.setProgressDrawable работает только один раз? для ответа, повторяется ниже:

Что я обнаружил, так это то, что drawable не знает его размера, когда вызывается setprogressdrawable. Когда он изначально настроен, он знает его размер. Это означает, что есть новый набор элементов рисования для панели поиска, но размер элемента рисования равен 0, вы ничего не увидите.

Решение состоит в том, чтобы сначала получить границы текущего объекта рисования, затем установить новый объект рисования и, наконец, снова установить границы:

Rect bounds = mySeekBar.getProgressDrawable().getBounds();
mySeekBar.setProgressDrawable(newSeekBarBackground);
mySeekBar.getProgressDrawable().setBounds(bounds);
11 голосов
/ 01 октября 2015

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

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

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

    progressBar.setProgressDrawable(resultDr);

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

...