31

我有一个由 9 个矩形组成的 VectorDrawable。这在 drawables 文件夹中定义为 XML。我将此设置为我在 xml 中声明的 ImageView 的背景。android:src="@drawable/squares00" 我想在运行时以编程方式更改一个或多个正方形的颜色。我知道有办法使用 VectorDrawable 动画来做到这一点。但我想知道是否有更简单的方法可以在 java 中访问我的 vectorDrawable,更新其属性(为矩形设置一种或多种填充颜色),然后使用更新的 VectoDrawable 更新图像背景。我的目标是 Android API 21(棒棒糖)

4

3 回答 3

23

简而言之:

  1. 无法直接访问VectorDrawable中的内部元素。
  2. AnimatedVectorDrawable只能访问内部元素。
  3. 使用AnimatedVectorDrawable模拟您需要的内容。

长:

1.您无权访问

查看VectorDrawable源代码将显示内部元素信息存储在内部私有状态类中。通过名称公开内部元素的唯一方法是,但不幸的是它是包私有的(默认) - 你不能使用它(除非你使用反射)。VectorDrawableStategetTargetByName

2. AnimatedVectorDrawable只有访问权限

getTargetByName仅由AnimatedVectorDrawable使用,我们可以通过搜索该方法的用法找到。

3.使用AnimatedVectorDrawable

所以现在我们看到这是唯一可用的选项,例如,我们可以尝试以下操作将元素“rect2”的颜色从白色更改为黑色:

更改颜色.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:duration="0"
        android:propertyName="fillColor"
        android:valueFrom="@color/white"
        android:valueTo="@color/black"/>
</set>

动画.xml:

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/vectordrawable" >
    <target
        android:name="rect2"
        android:animation="@anim/change_color" />
</animated-vector>

并使用此处描述的方法。

笔记

如果上述方法仍然不适合您,您可以尝试以下方法:

  • 复制整个VectorDrawable并调整它(未测试)
  • 使用反射getTargetByName获取内部元素。您需要先确定mutate对象。
于 2015-08-14T10:02:56.607 回答
0

试试这个库 https://github.com/devendroid/VectorChildFinder

val vector = VectorChildFinder(context, R.drawable.drawable_id, imageView)
vector.findPathByName("path_name").fillColor = Color.RED

<vector
    ...>

    <path
        android:name="path_name"
        android:fillColor="#000"
        android:pathData="..." />
</vector>
于 2020-05-05T22:46:18.450 回答
0

使用这个直接访问内部元素。它是实现这个答案

于 2017-05-13T18:13:55.783 回答