49

随着新的 android 支持更新,矢量可绘制对象获得向后兼容性。我有一个带有各种路径的矢量图像。我希望通过单击按钮或基于输入值以编程方式更改路径的颜色。是否可以访问向量路径的名称参数?然后改变颜色。

4

8 回答 8

57

可以使用 setTint 更改整个矢量的颜色。

您必须在布局文件中设置 ImageView,如下所示:

<ImageView
    android:id="@+id/myImageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:tint="@color/my_nice_color"
    android:src="@drawable/ic_my_drawable"
    android:scaleType="fitCenter" />

然后更改图像的颜色:

DrawableCompat.setTint(myImageView.getDrawable(), ContextCompat.getColor(context, R.color.another_nice_color));

注意:myImageView.getDrawable()如果矢量 drawable 设置为 imageView 作为背景,则给出 nullpointerexception。

于 2016-04-04T10:44:24.307 回答
39

使用它来更改矢量绘图中的路径颜色

VectorChildFinder vector = new VectorChildFinder(this, R.drawable.my_vector, imageView);

VectorDrawableCompat.VFullPath path1 = vector.findPathByName("path1");
path1.setFillColor(Color.RED); 

图书馆在这里:https ://github.com/devsideal/VectorChildFinder

于 2018-02-03T07:48:38.200 回答
9

有几种方法可以做同样的事情,但这适用于Vector DrawableSVG(本地/网络)。

imageView.setColorFilter(ContextCompat.getColor(context, 
R.color.headPink), android.graphics.PorterDuff.Mode.SRC_IN);

(用您选择的颜色更改 R.color.headPink)

于 2018-02-07T12:15:26.957 回答
4

您可以使用此方法在较低的 API 中更改颜色以更改片段中的矢量颜色

int myVectorColor = ContextCompat.getColor(getActivity(), R.color.colorBlack);
                    myButton.getIcon().setColorFilter(myVectorColor, PorterDuff.Mode.SRC_IN);

代替 getActivity 您应该使用 MainActivity.this 更改活动中的矢量颜色

于 2017-07-03T17:57:40.550 回答
3

可以在运行时更改单个路径的颜色,而无需使用反射。

VectorMaster 引入了对矢量可绘制对象的动态控制。使用这个库可以动态控制矢量可绘制对象的每个方面(通过 Java 实例)。

只需在应用的 build.gradle 中添加以下依赖项

dependencies {
    compile 'com.sdsmdg.harjot:vectormaster:1.0.9'
}

在您的情况下,您需要一个简单的颜色更改:

矢量示例:your_vector.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
<path
    android:name="outline"
    android:pathData="M20.84,4..."
    android:strokeColor="#5D5D5D"
    android:fillColor="#00000000"
    android:strokeWidth="2"/>

XML

<com.sdsmdg.harjot.vectormaster.VectorMasterView
    android:id="@+id/your_vector"
    android:layout_width="150dp"
    android:layout_height="150dp"
    app:vector_src="@drawable/your_drawable" />

爪哇

VectorMasterView heartVector = (VectorMasterView) 
findViewById(R.id.your_drawable);

// find the correct path using name
PathModel outline = heartVector.getPathModelByName("outline");

// set the stroke color
outline.setStrokeColor(Color.parseColor("#ED4337"));

// set the fill color (if fill color is not set or is TRANSPARENT, then no fill is drawn)
outline.setFillColor(Color.parseColor("#ED4337"));

来自:https ://github.com/harjot-oberai/VectorMaster ,获得 MIT 许可。

您现在可以完全控制矢量可绘制对象。

于 2017-11-07T16:10:38.117 回答
2

检查我对另一个问题的回答:https ://stackoverflow.com/a/38418049/1335438 。

关于如何通过使用主题和参数化路径以便能够动态设置它们来管理它是一个好主意。

于 2016-07-17T05:04:39.040 回答
0

正如@Eyal 在这篇文章中所说的那样 https://stackoverflow.com/a/32007436/4969047

不能在运行时更改单个路径的颜色。查看 的源代码VectorDrawableCompat,通过名称公开内部元素的唯一方法getTargetByName是存在于 的内部私有状态类VectorDrawableCompatStateVectorDrawableCompat

由于它是一个私有包(默认) - 你不能使用它(除非你使用反射)。

于 2016-05-25T09:14:19.857 回答
-1
DrawableCompat.setTint(imageView.getDrawable(),ContextCompat.getColor(getApplicationContext(), R.color.colorAccent));
于 2020-07-28T06:11:05.757 回答