以编程方式更改android中向量的填充颜色
我想以编程方式编辑Android中矢量文件的填充颜色 在xml文件中,我可以使用属性设置颜色 android:fillColor但我想在运行时更改颜色以编程方式更改android中向量的填充颜色,android,vector,android-vectordrawable,Android,Vector,Android Vectordrawable,我想以编程方式编辑Android中矢量文件的填充颜色 在xml文件中,我可以使用属性设置颜色 android:fillColor但我想在运行时更改颜色 有这样的例子吗?谢谢。如果您想更改整个颜色,可以应用PorterDuffColor过滤器。 但这对单个不起作用。只适用于整个可拉丝的 public void applyThemeToDrawable(Drawable image) { if (image != null) { PorterDuffColorFilter p
有这样的例子吗?谢谢。如果您想更改整个颜色,可以应用PorterDuffColor过滤器。 但这对单个
不起作用。只适用于整个可拉丝的
public void applyThemeToDrawable(Drawable image) {
if (image != null) {
PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.BLUE,
PorterDuff.Mode.SRC_ATOP);
image.setColorFilter(porterDuffColorFilter);
}
}
VectorDrawable扩展了Drawable类 正是您所需要的。这篇文章的作者。我刚刚添加了对的完全支持,它使您能够在运行时停止生成PNG:
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
如果在活动或应用程序的onCreate上设置了此行:
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
您不仅可以将SVG与srcCompat
一起使用,还可以与其他属性一起使用,如文本视图中的drawableLeft
、background
等、切换按钮等。如果在选择器上使用,它也可以工作
注意:我将代码修改为使用VectorDrawableCompat.create
而不是ResourcesCompat.getDrawable
。否则它将无法工作并抛出org.xmlpull.v1.XmlPullParserException:二进制XML文件行#2:无效的可绘制标记向量
中等帖子内容: 首先,我们为这两种饰品创建属性,以便我们可以更改它们的颜色:
<declare-styleable name="ChristmasTree">
<attr name="bauble_round" format="color" />
<attr name="bauble_small" format="color" />
</declare-styleable>
就这样!当你想改变颜色,只需设置一个不同的主题,你的绘图将更新。
有关完整示例,请参阅GitHub。将
setColorFilter()
方法添加到图像内容向量(在api级别8中添加),如下所示:
imgshare = (Imageview) findviewbyId(R.id.imageshare);
imgshare.setColorFilter(color);
setColorFilter(getResources().getColor(R.color.YOUR_color))
例如:
不喜欢setColorFilter(getResources().getColor(R.color.grey)) 这些答案都不适用于在运行时更改drawable中向量路径的颜色。事实上,我仍然没有弄明白这一点,但我认为这个答案会帮助很多人,他们只是试图在运行时创建和绘制一个简单的形状 我试图创建一个自定义边框Mvvm绑定,以便在运行时自定义按钮的边框和填充颜色。有一段时间,我试图修改一个Android drawable来实现这一点,但发现这是不可能的。最终我找到了如何使用GradientDrawable实现这一点 我在C#中使用Xamarin.Android,因此它看起来确实与Java略有不同
GradientDrawable gd = new GradientDrawable();
gd.SetColor(Color.Red);
gd.SetCornerRadius(10);
gd.SetStroke(3, Color.White);
view.Background = gd;
若要更改向量的颜色,请不要更改填充颜色。相反,以编程方式更改色调,这将做同样的事情,并为您节省大量时间!请参阅。是否有任何其他解决方案可以只对单个
进行着色。所以我想你不能通过编程改变单路径的颜色。至少不要完全随机的颜色。仅对于定义为XML转换的固定集,您始终可以在单独的图像中分割路径,覆盖这些视图,然后在各个视图上设置过滤器。在所有情况下都不理想,但对一些人来说,这很好。这是我们现在所做的,但在提出问题时,我们没有想到。但请记住,每次拆分时,这将使使用的内存加倍。大多数时候都没什么大不了的,但有时候这可能很重要。。你找到解决办法了吗??。。我也面临同样的问题。你可以使用android:tint在运行时使用SetColorFilter在XML中更改矢量文件的颜色。完整答案的博客非常有效,应该被接受为答案。我无法访问此链接,你可以更新它或给我另一个链接吗?仅供参考:请仔细阅读文档“此功能默认为禁用,因为启用它可能会导致内存使用问题…”快乐编码。这对API<21不起作用,因为您不能在fillColor
属性上使用类似?attr/colorPrimary
的值…@AlanNelson您可以通过这样做来实现,例如:final Resources.Theme=getResources().newTheme();theme.applyStyle(R.style.BaubleRound,false)代码>
final ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.DefaultScene);
final Drawable drawable = VectorDrawableCompat.create(getResources(), R.drawable.christmas, wrapper.getTheme());
imageView.setImageDrawable(drawable);
imgshare = (Imageview) findviewbyId(R.id.imageshare);
imgshare.setColorFilter(color);
GradientDrawable gd = new GradientDrawable();
gd.SetColor(Color.Red);
gd.SetCornerRadius(10);
gd.SetStroke(3, Color.White);
view.Background = gd;