如何在不修改原始drawable的情况下设置vectorDrawable的色调?

Posted

技术标签:

【中文标题】如何在不修改原始drawable的情况下设置vectorDrawable的色调?【英文标题】:How to set tint of vectorDrawable without modifying the original drawable? 【发布时间】:2019-04-06 15:11:45 【问题描述】:

我试图在我的 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 的情况下在代码中做到这一点?

【问题讨论】:

你必须首先改变你的Drawable 谢谢,可以了 android: Cloning a drawable in order to make a StateListDrawable with filters的可能重复 【参考方案1】:

您需要调用可绘制的mutate() 方法。来自documentation:

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

既然你想给你的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)

【讨论】:

非常感谢。这有帮助。

以上是关于如何在不修改原始drawable的情况下设置vectorDrawable的色调?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不知道宽度的情况下将元素存储在二维向量中?

InvalidFormatException for Date - 在不使用 JsonFormat 或修改原始类的情况下进行修复

如何在不破坏封装的情况下返回对 RefCell 内某些内容的引用?

如何在不更改原始内容的情况下操作 NSDictionary 内容的副本

组合:如何在不完成原始发布者的情况下替换/捕获错误?

如何编写一个函数,在不使用返回的情况下更改原始整数列表?