Існує 3 способи вирішити це питання:
- Як декларативно налаштувати колір смуги прогресу
- Як налаштувати колір смужки прогресу програмно, але вибрати колір із різних заздалегідь визначених кольорів, оголошених до моменту компіляції
- Як програмно налаштувати колір панелі прогресу, а також створити колір програмно.
Зокрема, існує велика плутанина навколо №2 та №3, як це видно в коментарях до відповіді amfcosta. Ця відповідь дасть непередбачувані результати кольорів у будь-який час, коли ви хочете встановити панель прогресу на будь-що, крім основних кольорів, оскільки він лише змінює колір фону, а фактична область "кліпу" смужки ходу все ще буде жовтою накладкою зі зменшеною непрозорістю. Наприклад, використання цього методу для встановлення тла на темно-фіолетовий призведе до того, що смужка "кліпу" прогресує кольором якогось божевільного рожевого кольору в результаті змішування темно-фіолетового та жовтого кольору через зменшену альфа.
Тож як ні круто, на відповідь Раян Райан, а Штарке відповідає на більшість №3, але для тих, хто шукає повне рішення №2 та №3:
Як налаштувати колір смужки прогресу програмно, але вибрати колір із заздалегідь визначеного кольору, оголошеного в XML
res / dravable / 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: Я знайшов час вирішити це правильно. Моя колишня відповідь залишила це трохи неоднозначним.
Програму ProgressBar складають у вигляді 3-х малюнків у шарі Dravavable.
- Шар 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);
Ура.
-Звінок