以编程方式更改android中矢量的fillColor

时间:2015-10-14 13:37:37

标签: android vector android-vectordrawable

我想以编程方式在Android中编辑矢量文件的填充颜色。

在xml文件中,我可以使用属性设置颜色      android:fillColor 但我想在运行时更改颜色。

有什么例子吗?感谢。

7 个答案:

答案 0 :(得分:26)

This正是您所需要的。致帖子的作者@emmaguy。我刚刚添加了Support Library 23.4+的完全支持,这使您可以在运行时停止生成png:

 // Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
 } 

如果此行已在您的活动或应用程序上设置,请创建:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

您不仅可以在srcCompat中使用SVG,还可以在TextView,ToggleButton等中使用其他属性,例如drawableLeftbackground等。如果在选择器上使用它也可以。

注意:我修改了代码以使用VectorDrawableCompat.create代替ResourcesCompat.getDrawable。否则它将无效并抛出org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag vector

中等帖子内容:

首先,我们为两种小玩意创建属性,因此我们可以改变它们的颜色:

<declare-styleable name="ChristmasTree">
    <attr name="bauble_round" format="color" />
    <attr name="bauble_small" format="color" />
</declare-styleable>

然后,在VectorDrawable中,设置我们想要动态更改的部分以使用这些属性:

<path
    android:fillColor="?attr/bauble_round"
    android:pathData="...." />
<path
    android:fillColor="?attr/bauble_small"
    android:pathData="...." />
...

创建主题并设置您要使用的颜色:

<style name="UpdatedScene" parent="DefaultScene">
    <item name="bauble_round">#db486e</item>
    <item name="bauble_small">#22c7f7</item>
</style>

<style name="DefaultScene">
    <item name="bauble_round">#fec758</item>
    <item name="bauble_small">#f22424</item>
</style>

在ImageView中使用drawable:

final ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.DefaultScene);
final Drawable drawable = VectorDrawableCompat.create(getResources(), R.drawable.christmas, wrapper.getTheme());
imageView.setImageDrawable(drawable);

就是这样!当您想要更改颜色时,只需设置不同的主题,您的drawable就会更新。 有关完整样本,请参阅GitHub repo

答案 1 :(得分:15)

如果要更改整个颜色,可以应用PorterduffColorFilter。 但这对单个AcroFields.Item不起作用。仅适用于整个绘图。

<path>

VectorDrawable扩展了Drawable类。 See Docs

答案 2 :(得分:6)

setColorFilter() 方法添加到您的图片内容向量(在api级别8中添加),如下所示:

imgshare = (Imageview) findviewbyId(R.id.imageshare);
imgshare.setColorFilter(color);

答案 3 :(得分:0)

button.setColorFilter(getResources()。getColor(R.color.YOUR_COLOR));

示例:

dislikeBtn.setColorFilter(getResources()。getColor(R.color.grey));

答案 4 :(得分:0)

这些答案都无法在运行时更改可绘制对象内部矢量路径的颜色。实际上,我仍然没有弄清楚这一点,但是我认为这个答案将对很多试图在运行时创建和绘制简单形状的人有所帮助。

我试图创建自定义边框Mvvm绑定,以在运行时自定义Button的边框和填充颜色。有一段时间,我试图修改一个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;

答案 5 :(得分:0)

要更改矢量的颜色,请不要更改 fillColor。相反,以编程方式更改色调,这将做同样的事情并为您节省大量时间!见this answer here

答案 6 :(得分:0)

当您的矢量有 2 个或更多 <path> 或您只想保持笔触颜色与填充颜色不同时寻找答案的人:

我认为没有办法以编程方式仅更改 Vector 的 fillColor 而忽略 strokeColor(tint 会同时修改两者)

我已经通过在 .xml 中定义了不同颜色的矢量资产的 3 个副本来解决问题,然后在 kotlin 中我刚刚设置了该矢量资产的正确副本。 例如: view.setBackgroundResource(R.drawable.myVectorColor1)

view.setBackgroundResource(R.drawable.myVectorColor2)