如何在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
相关产品推荐
相关产品推荐

