如何在不修改原始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 内某些内容的引用?