1

我有一个现有的图层列表,用于自定义 ProgressBar,如下所示:

style_progress_bar.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"
        android:drawable="#F6F3F1" />
    <item android:id="@android:id/secondaryProgress">
        <scale
            android:drawable="#DE0012"
            android:scaleWidth="100%" />
    </item>
    <item android:id="@android:id/progress">
        <scale
            android:drawable="#DE0012"
            android:scaleWidth="100%" />
    </item>
</layer-list>

此层列表用于覆盖 ProgressBar 的 progressDrawable 属性,并且像一个魅力一样工作。

现在,我想使用相同的主干,但我想以编程方式更改第二项和第三项的颜色,因为在很多情况下进度颜色应该会发生变化,并且我不会创建大量 xml 文件甚至不是一个好主意。

我设法阅读了上面的文件并阅读了它的第二个和第三个项目,但我找不到改变这两个项目的颜色的合适解决方案。除了颜色问题,一切都按预期工作。

LayerDrawable layers = (LayerDrawable) getResources().getDrawable(R.drawable.style_progress_bar);
int color = getResources().getColor(colorId); // This is the ID of the new color. I use it elsewhere so this should be 100% good

layers.getDrawable(1).setColorFilter(color, PorterDuff.Mode.MULTIPLY);
layers.getDrawable(2).setColorFilter(color, PorterDuff.Mode.MULTIPLY);

// I even called invalidate(); after all this. Nothing changed

我觉得我真的很接近结束这个,但我被卡住了。

有任何想法吗?谢谢!

4

1 回答 1

2

好吧,我在这里真的走得太远了,对不起。

深入挖掘我意识到我可以将所需的 2 个可绘制对象读取为 ScaleDrawable 对象,因为这是它们在 xml 文件中的设置方式,即比例。

这些比例项目中的每一个都有自己的可绘制对象集:

<scale 
    android:drawable="#DE0012" 
    android:scaleWidth="100%" />

所以我意识到,这些也可以以某种方式阅读。是的,它们可以被解读为 ColorDrawable 对象。在我拥有 2 个 ColorDrawable 对象时,我可以简单地为这些对象设置颜色。这是我做所有事情的最终代码:

private Drawable createDrawable(int colorId) {
    LayerDrawable layers = (LayerDrawable) getResources().getDrawable(R.drawable. style_progress_bar);
    int color = getResources().getColor(colorId);
    try {
        ScaleDrawable first = (ScaleDrawable) layers.getDrawable(1);
        ScaleDrawable second = (ScaleDrawable) layers.getDrawable(2);
        ColorDrawable secondaryColor = (ColorDrawable) first.getDrawable();
        secondaryColor.setColor(color);
        ColorDrawable primaryColor = (ColorDrawable) second.getDrawable();
        primaryColor.setColor(color);
    } catch (ClassCastException e) {
        e.printStackTrace();
    }
    return layers;
}

在此之后,我可以简单地调用上述方法并动态更改我的颜色。

progressBar.setProgressDrawable(createDrawable(colorId));

谢谢,对此感到抱歉,但我想我会留下这个问题,以防其他人在您需要使用 ScaleDrawable 时遇到这种特殊情况。

请注意,在您的 xml layer-list的项目中使用除比例之外的其他东西,会使 progressView 完全着色,并且您不会获得所需的结果,例如为实际进度使用不同的背景颜色和另一种颜色。

于 2014-10-21T16:43:33.783 回答