Как легко изменить цвет индикатора выполнения в Android? - PullRequest
2 голосов
/ 15 марта 2011

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

Ответы [ 3 ]

4 голосов
/ 15 марта 2011

Используйте метод ProgressBar:

public void setProgressDrawable (Drawable d)

и передайте Drawable в разных цветах, напр. ColorDrawable , который имеет метод setColor (int color).

Чтобы изменить цвета рисования png на лету, попробуйте: Как изменить цвета Drawable в Android?


РЕДАКТИРОВАТЬ:

Для рисования ProgressBar LayerDrawable выглядит так:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:drawable/screen_progress_frame" />
    <item>
        <scale scaleWidth="100%" scaleGravity="0x3" drawable="@android:drawable/screen_progress_inner" />
    </item>
</layer-list>

Имеет ScaleDrawable, который вы хотите раскрасить.

Создайте свой собственный LayerDrawable, похожий на описанный выше, и извлеките панель извлечения и измените ее цвет.

0 голосов
/ 01 октября 2015

Ну, для тех, кто ищет, как это сделать программно: не забудьте установить идентификаторы для ваших Drawables!

    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 имеет решающее значение и заботится о сохранении границ и фактического состоянияиндикатора выполнения.

(Кажется, что решение, предложенное vmayatskii вроде работ - но только если вы вызываете setProgress (value) aftrawards, и это значение должно отличаться от текущего значения прогресса)

0 голосов
/ 20 июля 2015

Это решение, которое вы можете использовать в коде (на основе решения pawelzieba).

ProgressBar progressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleHorizontal); 
progressBar.setProgressDrawable(new LayerDrawable(
           new Drawable[] { 
               new ColorDrawable(Color.RED),
               new ScaleDrawable(new ColorDrawable(Color.GREEN), Gravity.LEFT, 1, -1),
           })); 
... 
progressBar.setProgress(20);
...