gpt4 book ai didi

android - 如何以编程方式更改现有图层列表的项目(ScaleDrawable)的颜色

转载 作者:行者123 更新时间:2023-11-30 02:36:10 32 4
gpt4 key购买 nike

我有一个现有的图层列表,用于自定义 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 属性,并且非常有效。

现在,我想使用相同的 Backbone ,但我想以编程方式更改第二项和第三项的颜色,因为进度颜色在很多情况下都应该改变,而创建大量 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

我觉得我真的快要结束了,但我卡住了。

有什么想法吗?谢谢!

最佳答案

好吧,我真的跑题了,抱歉。

深入挖掘后,我意识到我可以将所需的 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 项目中使用 scale 之外的其他东西会使 progressView 完全着色,并且您不会获得所需的结果,比如使用不同的背景颜色和实际进度的另一种颜色。

关于android - 如何以编程方式更改现有图层列表的项目(ScaleDrawable)的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26491715/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com