Android изменение цвета горизонтального индикатора выполнения
Я установил горизонтальный индикатор выполнения.
Я хотел бы изменить цвет прогресс-желтый.
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="80dip"
android:layout_height="20dip"
android:focusable="false"
style="?android:attr/progressBarStyleHorizontal" />
проблема в том, что цвет прогресса отличается в разных устройствах. Итак, я хочу, чтобы он исправил цвет прогресса.
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 способа решить этот вопрос:
- как настроить цвет progressbar декларативно
- как настроить цвет progressbar программно, но выбрать цвет из различных предопределенных цветов, объявленных до времени компиляции
- как настроить цвет 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-фон
- слой 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);
ваше здоровье.
-Ланс
самое простое решение я нашел-это что-то вроде этого:
<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.
поделитесь своим ответом, если у вас есть какое-либо другое решение.