如何在不修改原始可绘制对象的情况下设置矢量可绘制对象的色调?

pix*_*rld 3 svg android android-vectordrawable

我试图在我的 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)
Run Code Online (Sandbox Code Playgroud)

我最终要修改原始的可绘制对象。有没有一种方法可以在不修改原始 SVG 的情况下在代码中做到这一点?

And*_*usa 5

您需要调用可绘制mutate()方法。从文档中:

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

由于您想对可绘制对象进行着色,因此您还需要使用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)
Run Code Online (Sandbox Code Playgroud)