Как изменить цвет индикатора прогресса ProgressBar в Android
Я установил горизонтальный ProgressBar
.
Я хотел бы изменить цвет прогресса на желтый.
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="80dip"
android:layout_height="20dip"
android:focusable="false"
style="?android:attr/progressBarStyleHorizontal" />
Проблема в том, что цвет выполнения у разных устройств разный.
Итак, я хочу, чтобы исправить цвет прогресса.
Ответы
Ответ 1
Я скопировал это из одного из моих приложений, поэтому есть несколько дополнительных атрибутов, но должен дать вам эту идею. Это из макета, который имеет индикатор выполнения:
<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" />
Затем создайте новый шаблон с чем-то похожим на следующий (в этом случае 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>
Вы можете изменить цвета по мере необходимости, это даст вам зеленый индикатор выполнения.
Ответ 2
Более простое решение:
progess_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>
Ответ 3
Если вы хотите изменить цвет индикатора выполнения, вы можете просто использовать цветной фильтр в методе Activity 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 вы можете использовать атрибут colorAccent style.
Ответ 4
Просто создайте стиль в 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"/>
и не имеет значения, ваш индикатор прогресса является горизонтальным или круглым. Все это.
Ответ 5
для уровня API 21 или выше просто используйте
android:progressBackgroundTint="@color/yourBackgroundColor"
android:progressTint="@color/yourColor"
Ответ 6
Есть 3 способа решить этот вопрос:
- Как отрегулировать цвет панели progress декларативно
- Как настроить цвет прогрессивной панели программно, но выберите цвет из разных предопределенных цветов, объявленных перед компиляцией.
- Как настроить цвет прогрессивной панели программно, а также создать цвет программно.
В частности, есть много путаницы вокруг № 2 и № 3, как видно в комментариях к ответу на amfcosta. Этот ответ даст непредсказуемые цветовые результаты в любое время, когда вы хотите установить индикатор прогресса на что-либо, кроме основных цветов, поскольку он только изменяет цвет фона, а фактическая область "клип" панели выполнения по-прежнему будет желтым наложением с уменьшенной непрозрачностью. Например, использование этого метода для установки фона в темный фиолетовый приведет к появлению индикатора прогресса "клип" цвета какого-то сумасшедшего розоватого цвета в результате темно-фиолетового и желтого смешивания с помощью уменьшенной альфа.
Так что, в любом случае, # 1 отвечает отлично Ryan и Štarke отвечает на большинство из # 3, но для тех, кто ищет полное решение для # 2 и # 3:
Как настроить цвет прогрессивной панели программно, но выберите цвет из заданного цвета, объявленного в XML
Рез/рисуем/my_progressbar.xml
Создайте этот файл, но измените цвета в my_progress и my_secondsProgress:
(ПРИМЕЧАНИЕ. Это всего лишь копия фактического файла XML, определяющего стандартный 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)
Как настроить цвет прогрессивной панели программно, а также создать цвет программно
EDIT: Я нашел время, чтобы решить это правильно. Мой прежний ответ оставил это немного двусмысленным.
A ProgressBar состоит из 3 Drawables в LayerDrawable.
- Уровень 1 - это фон
- Уровень 2 - это цвет вторичного прогресса
- Уровень 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);
Приветствия.
-Lance
Ответ 7
Самое простое решение, которое я выяснил, выглядит примерно так:
<item name="colorAccent">@color/white_or_any_color</item>
Поместите вышеуказанное в styles.xml
файл в папку res > values
.
ПРИМЕЧАНИЕ. Если вы используете какой-либо другой цвет акцента, то предыдущие решения должны быть хорошими.
API 21 или ВЫШЕ
Ответ 8
Для тех, кто ищет, как это сделать программно:
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);
Установка идентификаторов для чертежей имеет решающее значение и обеспечивает сохранение границ и фактического состояния индикатора выполнения.
Ответ 9
final LayerDrawable layers = (LayerDrawable) progressBar.getProgressDrawable();
layers.getDrawable(2).setColorFilter(color,PorterDuff.Mode.SRC_IN);
Ответ 10
Вы, ребята, действительно болят.
То, что вы можете сделать, - сделать ваш список слоев возможным с помощью xml first (это означает, что фон - это первый слой, который является вторичным прогрессом как второй слой, а другой - последний слой), затем измените цвет на код, выполнив следующее:
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 not a LayerDrawable");
progressBar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}
}
Этот метод даст вам максимальную гибкость в том, что измерение исходного оригинала объявлено в xml, БЕЗ МОДИФИКАЦИИ НА ЕГО СТРУКТУРЕ ПОСЛЕ УСТРОЙСТВА, особенно если вам нужно указать папку с файлом экрана xml, а затем просто изменить ТОЛЬКО ЦВЕТ через код. Нет повторного создания нового ShapeDrawable с нуля.
Ответ 11
Цвет 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);
}
Ответ 12
Если вы находитесь на уровне API 21 или выше, вы можете использовать эти атрибуты XML:
<!-- For indeterminate progress bar -->
android:indeterminateTint="@color/white"
<!-- For normal progress bar -->
android:progressTint="@color/white"
Ответ 13
Создайте нарисованный ресурс, какой фон вам нужен, в моем случае я назвал его bg_custom_progressbar.xml
<?xml version="1.0" encoding="utf-8"?>
<item>
<shape android:shape="rectangle" >
<corners android:radius="5dp"/>
<gradient
android:angle="180"
android:endColor="#DADFD6"
android:startColor="#AEB9A3" />
</shape>
</item>
<item>
<clip>
<shape android:shape="rectangle" >
<corners android:radius="5dp" />
<gradient
android:angle="180"
android:endColor="#44CF4A"
android:startColor="#2BB930" />
</shape>
</clip>
</item>
<item>
<clip>
<shape android:shape="rectangle" >
<corners android:radius="5dp" />
<gradient
android:angle="180"
android:endColor="#44CF4A"
android:startColor="#2BB930" />
</shape>
</clip>
</item>
Затем используйте этот пользовательский фон, как
<ProgressBar
android:id="@+id/progressBarBarMenuHome"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="6dp"
android:indeterminate="false"
android:max="100"
android:minWidth="200dp"
android:minHeight="50dp"
android:progress="10"
android:progressDrawable="@drawable/bg_custom_progressbar" />
Это прекрасно работает для меня
Ответ 14
выше ответы меняют весь цвет фона, и это ambigios, что он изменяет высоту индикатора выполнения до очень макс., который не может быть изменен в xml.
лучший способ изменить только статус шага выполнения, сколько выполнено. Является 20% красного цвета, 50% желтого цвета 70% и выше зеленого цвета. вы можете сделать это программно в java.
поделиться своим ответом, если у вас есть другие решения.