如何在不修改原始矢量图的情况下设置矢量图的色调?

3

我正在尝试在我的View类中使用SVG文件,遇到的问题是:当我像这样设置VectorDrawable的色调颜色时:

var d = AppCompatResources.getDrawable(context, R.drawable.icon)
var vDraw = VectorDrawable()
vDraw  = d as VectorDrawable
DrawableCompat.setTint(vDraw , Color.RED)
vDraw.draw(canvas)

我最终需要修改原始的可绘制对象。有没有一种方法可以在不修改原始SVG的情况下在代码中完成这个操作?


你必须先使用mutate()来改变你的Drawable - pskink
谢谢,那个可以。 - pixelWorld
1个回答

5
您需要调用可绘制的mutate()方法。根据文档

使此可绘制对象变得可变,此操作无法撤销。可变的可绘制对象保证不会与任何其他可绘制对象共享状态。当您需要修改从资源中加载的可绘制对象的属性时,这非常有用。默认情况下,所有从同一资源加载的可绘制对象实例都共享一个公共状态;如果您修改一个实例的状态,则所有其他实例都会接收相同的修改。在可变的可绘制对象上调用此方法将不会产生任何效果。

由于您需要对可绘制的进行着色处理,因此还需要使用DrawableCompat.wrap(drawable)。这将允许:

可能包装{@code drawable}以便它可以用于在不同的API级别中进行着色处理,通过此类中的着色处理方法。

将其应用到您的代码中:

var drawable = AppCompatResources.getDrawable(context, R.drawable.icon)
drawable = drawable.mutate();
drawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(drawable , Color.RED)
drawable.draw(canvas)

非常感谢。这很有帮助。 - pixelWorld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接