You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android矢量Drawable中复用group或path元素

Android矢量Drawable复用组元素的替代方案

Android原生Vector Drawable并没有直接对应SVG <use>标签的复用语法,但可以通过以下两种方式实现代码复用,避免重复编写组内路径:

1. 抽离公共组为独立Vector Drawable

将需要复用的group内容单独提取为一个独立的Vector Drawable文件,然后在主Drawable中通过<item>标签多次引用,并添加不同的变换效果。

步骤1:创建复用的组Drawable

新建res/drawable/reusable_group.xml,写入原group的完整内容:

<vector
    android:width="9dp"
    android:height="16dp"
    android:viewportWidth="9"
    android:viewportHeight="16">
    <group
        android:name="group"
        android:pivotX="4.5"
        android:pivotY="9">
        <path
            android:fillColor="#F57C00"
            android:pathData="M4.5,6 c0.1,-1 0.2,-2 0.2,-3 c0,-1 -0.4,-1 -0.4,0 c0,1 0.1,2 0.2,3 z" />

        <path
            android:fillType="evenOdd"
            android:pathData="M4.5,6.5 c0.1,-1 0.2,-2 0.3,-3.5 c0,-1.2 -0.6,-1.2 -0.6,0 c0.1,1.5 0.2,2.5 0.3,3.5 z">
            <aapt:attr name="android:fillColor">
                <gradient
                    android:centerX="4.5"
                    android:centerY="2.5"
                    android:gradientRadius="5"
                    android:type="radial">
                    <item
                        android:color="#B9F57C00"
                        android:offset="0.0" />
                    <item
                        android:color="#00000000"
                        android:offset="1.0" />
                </gradient>
            </aapt:attr>
        </path>
    </group>
</vector>

步骤2:在主Drawable中引用并添加变换

修改原主Drawable,用<item>标签多次引用上述文件,并通过嵌套<group>添加旋转、位移等效果:

<vector
    android:name="vector"
    android:width="9dp"
    android:height="16dp"
    android:viewportWidth="9"
    android:viewportHeight="16">

    <path
        android:fillColor="#11141C"
        android:pathData="M0,0 H9 V16 H0 Z" />

    <!-- 原位置的组 -->
    <item
        android:drawable="@drawable/reusable_group"
        android:x="0dp"
        android:y="0dp" />

    <!-- 旋转45度的组 -->
    <item
        android:drawable="@drawable/reusable_group"
        android:x="0dp"
        android:y="0dp">
        <group
            android:pivotX="4.5"
            android:pivotY="9"
            android:rotation="45" />
    </item>

    <!-- 位移并旋转90度的组 -->
    <item
        android:drawable="@drawable/reusable_group"
        android:x="2dp"
        android:y="2dp">
        <group
            android:pivotX="4.5"
            android:pivotY="9"
            android:rotation="90" />
    </item>
</vector>

2. 结合AnimatedVectorDrawable实现复用与过渡动画

如果需要为复用的组添加过渡动画(如旋转动画),可以借助AnimatedVectorDrawable,将公共组作为动画目标,多次复用并绑定不同动画。

步骤1:定义旋转动画

新建res/animator/rotate_45.xml:

<objectAnimator
    android:duration="1000"
    android:propertyName="rotation"
    android:valueFrom="0"
    android:valueTo="45"
    android:valueType="floatType" />

新建res/animator/rotate_90.xml:

<objectAnimator
    android:duration="1000"
    android:propertyName="rotation"
    android:valueFrom="0"
    android:valueTo="90"
    android:valueType="floatType" />

步骤2:创建AnimatedVectorDrawable引用复用组

新建res/drawable/animated_group_45.xml:

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/reusable_group">
    <target
        android:name="group"
        android:animation="@animator/rotate_45" />
</animated-vector>

新建res/drawable/animated_group_90.xml:

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/reusable_group">
    <target
        android:name="group"
        android:animation="@animator/rotate_90" />
</animated-vector>

步骤3:在布局或代码中使用

在布局中可以直接引用这些动画Drawable,或在代码中启动动画:

val animatedDrawable = findViewById<ImageView>(R.id.image_view).drawable as AnimatedVectorDrawable
animatedDrawable.start()

内容的提问来源于stack exchange,提问作者K-Galalem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:15:31