以编程方式更新android Vector Drawable

时间:2015-03-01 06:57:37

标签: android android-vectordrawable

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

3 个答案:

答案 0 :(得分:20)

简而言之:

  1. 可以直接访问VectorDrawable中的内部元素。
  2. AnimatedVectorDrawable只能访问内部元素。
  3. 使用AnimatedVectorDrawable来模拟您的需求。
  4. 长:

    <强> 1。您无权访问

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

    <强> 2。 AnimatedVectorDrawable只能访问

    getTargetByName仅供AnimatedVectorDrawable使用,我们可以通过searching for usages找到该方法。

    第3。使用AnimatedVectorDrawable

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

    change_color.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>
    

    animation.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>
    

    并使用here描述的方法。

    注意

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

    • 复制整个VectorDrawable并进行调整(未经测试)
    • 使用getTargetByName的反射来获取内部元素。您需要先确保mutate对象。

答案 1 :(得分:0)

使用此library直接访问内部元素。它是实现此answer

答案 2 :(得分: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>