如何在按钮单击时更改矢量可绘制路径的颜色

随着新的Android支持更新,矢量drawables获得向后兼容性。 我有一个带有各种路径的矢量图像。 我希望路径的颜色在单击按钮时更改,或者根据输入值以编程方式更改。 是否可以访问矢量路径的name参数? 然后改变颜色。

Solutions Collecting From Web of "如何在按钮单击时更改矢量可绘制路径的颜色"

使用此选项可更改矢量drawable中的路径颜色

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

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

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

  

然后更改图像的颜色:

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

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

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

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

代替getActivity,你应该使用MainActivity.this来改变活动中的矢量颜色

在另一个问题上查看我的答案: https : //stackoverflow.com/a/38418049/1335438 。

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

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

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

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

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

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

矢量示例:your_vector.xml

   

XML

  

Java

 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 ,在麻省理工学院获得许可。

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

正如@Eyal在本文中所述, https: //stackoverflow.com/a/32007436/4969047

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

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

有几种方法可以做同样的事情,但这适用于Vector DrawablesSVG (Local / Network)。

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

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