【问题标题】:How to set tint of vectorDrawable without modifying the original drawable?如何在不修改原始drawable的情况下设置vectorDrawable的色调?
【发布时间】: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 的情况下在代码中做到这一点?
【问题讨论】:
标签:
android
svg
android-vectordrawable
【解决方案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)