Есть 3 способа решить этот вопрос:
- Как правильно настроить цвет индикатора выполнения
- Как программно настроить цвет индикатора выполнения, но выбрать цвет из различных предопределенных цветов, объявленных до компиляции
- Как настроить цвет индикатора выполнения программно, а также создать цвет программно.
В частности, существует много путаницы вокруг # 2 и # 3, как видно из комментариев к ответу amfcosta. Этот ответ даст непредсказуемые цветовые результаты в любое время, когда вы захотите установить индикатор выполнения на что угодно, кроме основных цветов, так как он только изменяет цвет фона, а фактическая область «клипа» индикатора выполнения все равно будет наложена желтым цветом с уменьшенной непрозрачностью. Например, использование этого метода для установки темно-фиолетового фона приведет к тому, что индикатор выполнения «обрезает» какой-то сумасшедший розоватый цвет в результате смешивания темно-фиолетового и желтого цветов с помощью уменьшенного альфа-канала.
Так или иначе, Райан отлично отвечает на вопрос № 1, а Штарке отвечает на большинство вопросов № 3, но для тех, кто ищет полное решение для № 2 и № 3:
Как программно настроить цвет индикатора выполнения, но выбрать цвет из предварительно определенного цвета, объявленного в XML
res / drawable / my_progressbar.xml :
Создайте этот файл, но измените цвета в my_progress и my_secondsProgress:
(ПРИМЕЧАНИЕ. Это просто копия фактического файла XML, определяющего SDK ProgressBar по умолчанию для Android, но я изменил идентификаторы и цвета. Оригинал называется 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 состоит из 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