47

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

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

有什么例子吗?谢谢。

4

7 回答 7

50

正是您所需要的。感谢帖子作者@emmaguy。我刚刚添加了对Support Library 23.4+的全面支持,它使您能够在运行时停止生成 png:

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

如果在您的 Activity 或 Application 的 onCreate 上设置了这一行:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

您不仅可以将 SVG 与TextView、ToggleButton 等中的 、 等其他属性一起使用srcCompat,还可以与其他属性一起使用。如果在选择器上使用它也可以工作。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 中使用可绘制对象:

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

而已!当您想更改颜色时,只需设置不同的主题,您的可绘制对象就会更新。有关完整示例,请参阅 GitHub存储库。

于 2016-07-17T04:59:33.017 回答
24

如果要更改整个颜色,可以应用 PorterduffColorFilter。但这不适用于单个<path>. 仅适用于整个可绘制对象。

public void applyThemeToDrawable(Drawable image) {
    if (image != null) {
        PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.BLUE,
                PorterDuff.Mode.SRC_ATOP);

        image.setColorFilter(porterDuffColorFilter);
    }
}

VectorDrawable 扩展了 Drawable 类。查看文档

于 2015-10-14T13:51:53.160 回答
15

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

imgshare = (Imageview) findviewbyId(R.id.imageshare);
imgshare.setColorFilter(color);
于 2017-05-17T05:13:17.133 回答
1

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

我试图创建一个自定义边框 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;
于 2020-10-01T18:32:22.497 回答
1

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

例子:

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

于 2020-06-09T15:23:54.257 回答
0

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

我认为没有一种方法可以仅以编程方式更改fillColorVector 的 ,而忽略strokeColor(色调会同时修改两者)

我通过在 .xml 中定义了不同颜色的 Vector 资产创建 3 个副本,然后在 kotlin 中设置了该 Vector 资产的正确副本,从而解决了这个问题。例如: view.setBackgroundResource(R.drawable.myVectorColor1)

view.setBackgroundResource(R.drawable.myVectorColor2)

于 2021-07-15T13:39:31.883 回答
-1

要更改矢量的颜色,请不要更改 fillColor。相反,以编程方式更改色调,这将做同样的事情并为您节省大量时间!在这里看到这个答案

于 2021-04-06T21:29:36.597 回答