Android: программно установить цвет на ProgressBar

Я хотел бы программно установить цвет для индикатора выполнения primaryProgress,secondaryProgress, поскольку цвет будет изменен в соответствии с цветом фона экрана.

Код:

LayerDrawable progressDrawable = (LayerDrawable) ProgressBar1.getProgressDrawable();
Drawable backgroundColor = progressDrawable.getDrawable(0);
Drawable secondaryColor = progressDrawable.getDrawable(1);
Drawable primaryColor = progressDrawable.getDrawable(2);

final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
primaryColor = new ShapeDrawable(new RoundRectShape(roundedCorners, null, null));
secondaryColor = new ShapeDrawable(new RoundRectShape(roundedCorners, null, null));

primaryColor.setColor((Color.rgb(color_normal[0], color_normal[1], color_normal[2])), null);
secondaryColor.setColor((Color.rgb(color_normal[0], color_normal[1], color_normal[2])), null);

progressDrawable.setDrawableByLayerId(progressDrawable.getId(2), new ClipDrawable(primaryColor, Gravity.LEFT, ClipDrawable.HORIZONTAL));

...

Редактировать:

** цветовой код здесь предназначен только для тестирования. Впоследствии цветовой код будет ссылаться на другую часть для соответствующих обновлений.

    secondaryColor.setColorFilter((Color.rgb(255, 0, 0)), PorterDuff.Mode.SRC_OVER);
    primaryColor.setColorFilter((Color.rgb(0, 255, 213)), PorterDuff.Mode.SRC_OVER);        

    progressDrawable.setDrawableByLayerId(progressDrawable.getId(2), new ClipDrawable(primaryColor, Gravity.LEFT, ClipDrawable.HORIZONTAL));
    progressDrawable.setDrawableByLayerId(progressDrawable.getId(1), new ClipDrawable(secondaryColor, Gravity.LEFT, ClipDrawable.HORIZONTAL));
    ProgressBar1.setProgressDrawable(progressDrawable); 
    ProgressBar1.setProgress(progress);
    ProgressBar1.setSecondaryProgress(secondaryProgress);

Вопрос:

Он подчеркивает красным цветом primanyColor.setColor и сообщает, что The method setColor(int, null) is undefined for the type Drawable .

Как я могу изменить приведенные выше коды, чтобы они работали? Спасибо!


person pearmak    schedule 03.07.2015    source источник
comment
Спасибо. Я тоже пробовал это, и это дает ошибку: The method getPaint() is undefined for the type Drawable   -  person pearmak    schedule 03.07.2015
comment
@pearmak: хорошо, тогда сделай это методом primaryColor.setColorFilter   -  person ρяσѕρєя K    schedule 03.07.2015
comment
сделай это ShapeDrawable primaryColor тогда   -  person M D    schedule 03.07.2015
comment
Я думаю, вы можете получить что-то отсюда !!-----› geeks.gallery/horizontal-and-circular-progress-bar-in-android 101apps.co.za/articles/android-s-progress-bars.html tiemenschut.com/how-to-customize-android-progress-bars   -  person Chaudhary Amar    schedule 03.07.2015
comment
@AmarbirSingh: Спасибо за ссылку. Я также исследовал такие 2 ссылки раньше, но они через xml, а не программно, которые, похоже, не могут удовлетворить запрос на динамическое изменение цветов в соответствии с цветом фона экрана.   -  person pearmak    schedule 03.07.2015
comment
@ρяσѕρєяK: спасибо за ваше направление, я попытался использовать setColorFilter, как советовали, с правилом, что вторичный прогресс должен быть больше, чем primanyprogress, я не знаю, почему он просто показывает только вторичный прогресс (красный). Пожалуйста, смотрите обновленный код в вопросах... большое спасибо!   -  person pearmak    schedule 03.07.2015
comment
@pearmak: попробуй другой цвет для примани, например (0,128,0)   -  person ρяσѕρєя K    schedule 03.07.2015
comment
stackoverflow.com/ вопросы/10951978/   -  person Chaudhary Amar    schedule 03.07.2015
comment
@ρяσѕρєяK: Большое спасибо! Это работает сейчас! Было бы приятно, если бы вы разместили ответ в разделе «Редактировать».   -  person pearmak    schedule 03.07.2015


Ответы (3)


Чтобы установить цвета для Drawable, используйте Drawable.setColorFilter. подобно:

primaryColor.setColorFilter((Color.rgb(0,128,0)), 
                                                 PorterDuff.Mode.SRC_OVER);        
person ρяσѕρєя K    schedule 03.07.2015

Вот код для изменения цвета ProgressBar программно для минимальной версии sdk 21 и выше.

ProgressBar myProgress = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
myProgress.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));
person Naveen Kumar M    schedule 25.07.2017
comment
мин сдк 21 . - person Bruno Sosa Fast Tag; 10.04.2018

Что вы можете сделать, так это сначала сделать список слоев доступным для рисования через xml (имеется в виду фон как первый слой, рисуемый объект, представляющий вторичный прогресс, как второй слой, и другой рисуемый объект, который представляет первичный прогресс как последний слой), затем измените цвет кода, выполнив следующие действия:

public void setPrimaryProgressColor(int colorInstance) {
      if (progressBar.getProgressDrawable() instanceof LayerDrawable) {
        Log.d(mLogTag, "Drawable is a layer drawable");
        LayerDrawable layered = (LayerDrawable) progressBar.getProgressDrawable();
        Drawable circleDrawableExample = layered.getDrawable(<whichever is your index of android.R.id.progress>);
        circleDrawableExample.setColorFilter(colorInstance, PorterDuff.Mode.SRC_IN);
        progressBar.setProgressDrawable(layered);
    } else {
        Log.d(mLogTag, "Fallback in case it's not a LayerDrawable");
        progressBar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
    }
}

Этот метод даст вам наилучшую гибкость в том, что измерение вашего исходного чертежа, объявленного в xml, БЕЗ МОДИФИКАЦИИ ЕГО СТРУКТУРЫ ПОСЛЕ ПОСЛЕДНЕГО ОБРАЗА, особенно если вам нужно иметь конкретную папку экрана файла xml, а затем просто изменить ТОЛЬКО ЦВЕТ через код. Никакого повторного создания нового ShapeDrawable с нуля.

person Pier Betos    schedule 30.06.2016
comment
Это приведет к сбою моего приложения при использовании внутри ViewHolder. - person Henrique de Sousa; 25.07.2016
comment
3 вещи: - Убедитесь, что ваш индикатор прогресса не нулевой - Убедитесь, что ваш индикатор прогресса использует список слоев, который можно нарисовать в его макете xml - Убедитесь, что в вашем списке слоев каждый элемент идентифицирован внутри xml: ‹item android:id=@android: id/background› ‹item android:id=@android:id/secondaryProgress› ‹item android:id=@android:id/progress› - person Pier Betos; 25.07.2016
comment
Да, индикатор прогресса не нулевой. И да, моя полоса прогресса использует рисуемый список слоев. И да, к сожалению, у него есть оба 3 :( В любом случае спасибо. Я решил это, используя progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED)); - person Henrique de Sousa; 25.07.2016
comment
Идеальное решение для layer-list drawable. - person Chintan Shah; 11.04.2017
comment
вместо этого, используя layered.getDrawable(‹какой бы ни был ваш индекс android.R.id.progress›), используйте layered.findDrawableByLayerId(android.R.id.progress), который менее подвержен ошибкам - person Tinfu; 08.12.2017