有3种方法可以解决这个问题:
- 如何以声明方式调整进度条颜色
- 如何以编程方式调整进度条颜色,但从编译时声明的各种预定颜色中选择颜色
- 如何以编程方式调整进度条颜色,以及以编程方式创建颜色。
特别是在 #2 和 #3 周围存在很多混淆,如对 amfcosta 答案的评论中所见。每当您想将进度条设置为除原色以外的任何颜色时,该答案都会产生不可预测的颜色结果,因为它只会修改背景颜色,而实际的进度条“剪辑”区域仍将是黄色覆盖,不透明度降低。例如,使用该方法将背景设置为深紫色将导致进度条“剪辑”颜色为某种疯狂的粉红色,这是由于深紫色和黄色通过降低 alpha 混合而产生的。
所以无论如何,Ryan 完美地回答了#1,而 Štarke 回答了#3 的大部分内容,但对于那些寻求#2 和#3 的完整解决方案的人来说:
如何以编程方式调整进度条颜色,但从 XML 中声明的预定颜色中选择颜色
res/drawable/my_progressbar.xml:
创建此文件,但更改 my_progress 和 my_secondsProgress 中的颜色:
(注意:这只是定义默认 android SDK ProgressBar 的实际 XML 文件的副本,但我更改了 ID 和颜色。原始文件名为 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 由一个 LayerDrawable 中的 3 个 Drawable 组成。
- 第 1 层是背景
- 第 2 层是次要进度颜色
- 第三层是主要的进度条颜色
在下面的示例中,我将主进度条的颜色更改为青色。
//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);
干杯。
-槊