内联复杂 XML 资源

某些资源类型是由多个复杂资源(由 XML 文件表示)组成的。一个例子是动画矢量可绘制对象,它是一个可绘制对象资源,封装了一个矢量可绘制对象和一个动画。这需要使用至少三个 XML 文件,如以下示例所示。

res/drawable/avd.xml
<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/vectordrawable" >
    <target
        android:name="rotationGroup"
        android:animation="@anim/rotation" />
</animated-vector>
res/drawable/vectordrawable.xml
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="64dp"
    android:width="64dp"
    android:viewportHeight="600"
    android:viewportWidth="600" >
    <group
        android:name="rotationGroup"
        android:pivotX="300.0"
        android:pivotY="300.0"
        android:rotation="45.0" >
        <path
            android:fillColor="#000000"
            android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
    </group>
</vector>
res/anim/rotation.xml
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/android"
    android:duration="6000"
    android:propertyName="rotation"
    android:valueFrom="0"
    android:valueTo="360" />

如果矢量可绘制对象和动画在其他地方重复使用,这是实现动画矢量可绘制对象的最佳方法。但是,如果这些文件仅用于此动画矢量可绘制对象,则有一种更紧凑的方法可以实现它们。

使用 AAPT 的内联资源格式,您可以在同一个 XML 文件中定义所有三个资源,如以下示例所示。对于动画矢量可绘制对象,请将文件放在 res/drawable/ 下。

res/drawable/avd.xml
<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt" >

    <aapt:attr name="android:drawable" >
        <vector
            android:height="64dp"
            android:width="64dp"
            android:viewportHeight="600"
            android:viewportWidth="600" >
            <group
                android:name="rotationGroup"
                android:pivotX="300.0"
                android:pivotY="300.0"
                android:rotation="45.0" >
                <path
                    android:fillColor="#000000"
                    android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
            </group>
        </vector>
    </aapt:attr>

    <target android:name="rotationGroup">
        <aapt:attr name="android:animation" >
            <objectAnimator
                android:duration="6000"
                android:propertyName="rotation"
                android:valueFrom="0"
                android:valueTo="360" />
        </aapt:attr>
    </target>
</animated-vector>

XML 标签 <aapt:attr > 告诉 AAPT 将标签的子级视为资源,并将其提取到自己的资源文件中。属性名称中的值指定在父标签内使用内联资源的位置。

AAPT 为所有内联资源生成资源文件和名称。使用此内联格式构建的应用程序与所有版本的 Android 兼容。