动画资源

动画资源可以定义两种类型的动画之一

属性动画
通过使用 Animator 在设定的时间内修改对象的属性值来创建动画。
视图动画

您可以使用视图动画框架完成两种类型的动画

属性动画

在 XML 中定义的动画,在设定的时间内修改目标对象的属性,例如背景颜色或 alpha 值。

文件位置
res/animator/filename.xml
文件名用作资源 ID。
编译后的资源数据类型
指向 ValueAnimatorObjectAnimatorAnimatorSet 的资源指针
资源引用
在基于 Java 或 Kotlin 的代码中:R.animator.filename
在 XML 中:@[package:]animator/filename
语法
<set
  android:ordering=["together" | "sequentially"]>

    <objectAnimator
        android:propertyName="string"
        android:duration="int"
        android:valueFrom="float | int | color"
        android:valueTo="float | int | color"
        android:startOffset="int"
        android:repeatCount="int"
        android:repeatMode=["restart" | "reverse"]
        android:valueType=["intType" | "floatType"]/>

    <animator
        android:duration="int"
        android:valueFrom="float | int | color"
        android:valueTo="float | int | color"
        android:startOffset="int"
        android:repeatCount="int"
        android:repeatMode=["restart" | "reverse"]
        android:valueType=["intType" | "floatType"]/>

    <set>
        ...
    </set>
</set>

文件必须只有一个根元素:<set><objectAnimator><valueAnimator>。您可以将动画元素组合在 <set> 元素中,包括其他 <set> 元素。

元素
<set>
一个包含其他动画元素(<objectAnimator><valueAnimator> 或其他 <set> 元素)的容器。表示一个 AnimatorSet

您可以指定嵌套的 <set> 标签以进一步分组动画。每个 <set> 都可以定义自己的 ordering 属性。

属性

android:ordering
关键字。指定此集合中动画的播放顺序。
描述
顺序播放按顺序播放此集合中的动画。
together(默认)同时播放此集合中的动画。
<objectAnimator>
在特定时间内为对象的特定属性添加动画效果。表示一个 ObjectAnimator

属性

android:propertyName
字符串必需。要为其添加动画效果的对象属性,按其名称引用。例如,您可以为 View 对象指定 "alpha""backgroundColor"。但 objectAnimator 元素不公开 target 属性,因此您无法在 XML 声明中设置要添加动画效果的对象。您必须通过调用 loadAnimator() 来扩充您的动画 XML 资源,并调用 setTarget() 来设置包含此属性的目标对象。
android:valueTo
浮点数、整数或颜色必需。动画属性的结束值。颜色表示为六位十六进制数字,例如 #333333。
android:valueFrom
浮点数、整数或颜色。动画属性的起始值。如果未指定,动画将从属性的 get 方法获得的值开始。颜色表示为六位十六进制数字,例如 #333333。
android:duration
整数。动画持续时间(以毫秒为单位)。默认值为 300 毫秒。
android:startOffset
整数。调用 start() 后动画延迟的毫秒数。
android:repeatCount
整数。动画重复的次数。设置为 "-1" 表示无限重复,或设置为正整数。例如,值为 "1" 表示动画在初始运行后重复一次,因此动画总共播放两次。默认值为 "0",表示不重复。
android:repeatMode
整数。动画到达动画结束时的行为方式。此属性要生效,android:repeatCount 必须设置为正整数或 "-1"。设置为 "reverse" 可让动画在每次迭代时反转方向,或设置为 "restart" 可让动画每次从头开始循环。
android:valueType
关键字。如果值为颜色,请勿指定此属性。动画框架会自动处理颜色值。
描述
intType指定动画值为整数。
floatType(默认)指定动画值为浮点数。
<animator>
在指定时间内执行动画。表示一个 ValueAnimator

属性

android:valueTo
浮点数、整数或颜色必需。动画结束的值。颜色表示为六位十六进制数字,例如 #333333。
android:valueFrom
浮点数、整数或颜色必需。动画开始的值。颜色表示为六位十六进制数字,例如 #333333。
android:duration
整数。动画持续时间(以毫秒为单位)。默认值为 300 毫秒。
android:startOffset
整数。调用 start() 后动画延迟的毫秒数。
android:repeatCount
整数。动画重复的次数。设置为 "-1" 表示无限重复,或设置为正整数。例如,值为 "1" 表示动画在初始运行后重复一次,因此动画总共播放两次。默认值为 "0",表示不重复。
android:repeatMode
整数。动画到达动画结束时的行为方式。此属性要生效,android:repeatCount 必须设置为正整数或 "-1"。设置为 "reverse" 可让动画在每次迭代时反转方向,或设置为 "restart" 可让动画每次从头开始循环。
android:valueType
关键字。如果值为颜色,请勿指定此属性。动画框架会自动处理颜色值。
描述
intType指定动画值为整数。
floatType(默认)指定动画值为浮点数。
示例

XML 文件保存在 res/animator/property_animator.xml

<set android:ordering="sequentially">
    <set>
        <objectAnimator
            android:propertyName="x"
            android:duration="500"
            android:valueTo="400"
            android:valueType="intType"/>
        <objectAnimator
            android:propertyName="y"
            android:duration="500"
            android:valueTo="300"
            android:valueType="intType"/>
    </set>
    <objectAnimator
        android:propertyName="alpha"
        android:duration="500"
        android:valueTo="1f"/>
</set>

要运行此动画,请在代码中将 XML 资源扩充到 AnimatorSet 对象,然后在启动动画集之前为所有动画设置目标对象。调用 setTarget() 可方便地为 AnimatorSet 的所有子项设置单个目标对象。以下代码演示了如何执行此操作:

Kotlin

val set: AnimatorSet = AnimatorInflater.loadAnimator(myContext, R.animator.property_animator)
    .apply {
        setTarget(myObject)
        start()
    }

Java

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
    R.animator.property_animator);
set.setTarget(myObject);
set.start();
另请参阅

视图动画

视图动画框架支持补间动画和逐帧动画,两者都在 XML 中声明。以下部分描述了如何使用这两种方法。

补间动画

在 XML 中定义的动画,对图形执行旋转、淡入淡出、移动和拉伸等过渡。

文件位置
res/anim/filename.xml
文件名用作资源 ID。
编译后的资源数据类型
指向 Animation 的资源指针
资源引用
在 Java 中:R.anim.filename
在 XML 中:@[package:]anim/filename
语法
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource"
    android:shareInterpolator=["true" | "false"] >
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />
    <scale
        android:fromXScale="float"
        android:toXScale="float"
        android:fromYScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float" />
    <translate
        android:fromXDelta="float"
        android:toXDelta="float"
        android:fromYDelta="float"
        android:toYDelta="float" />
    <rotate
        android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float" />
    <set>
        ...
    </set>
</set>

文件必须只有一个根元素:<alpha><scale><translate><rotate><set> 元素,其中包含一个或多个其他动画元素组(包括嵌套的 <set> 元素)。

元素
<set>
一个包含其他动画元素(<alpha><scale><translate><rotate>)或其他 <set> 元素的容器。表示一个 AnimationSet

属性

android:interpolator
Interpolator 资源。要应用于动画的 Interpolator。该值必须是对指定插值器的资源的引用,而不是插值器类名。平台提供了默认的插值器资源,您也可以创建自己的插值器资源。有关 插值器 的更多信息,请参阅以下讨论。
android:shareInterpolator
布尔值。如果您希望在所有子元素之间共享相同的插值器,则为 "true"
<alpha>
淡入或淡出动画。表示一个 AlphaAnimation

属性

android:fromAlpha
浮点数。起始不透明度偏移,其中 0.0 为透明,1.0 为不透明。
android:toAlpha
浮点数。结束不透明度偏移,其中 0.0 为透明,1.0 为不透明。

有关 <alpha> 支持的更多属性,请参阅 Animation 的类参考,此元素的 XML 属性继承自该类。

<scale>
缩放动画。您可以通过指定 pivotXpivotY 来指定图像向外或向内增长的中心点。例如,如果这些值为 0,0(左上角),则所有增长都向下和向右。表示一个 ScaleAnimation

属性

android:fromXScale
浮点数。起始 X 尺寸偏移,其中 1.0 表示无变化。
android:toXScale
浮点数。结束 X 尺寸偏移,其中 1.0 表示无变化。
android:fromYScale
浮点数。起始 Y 尺寸偏移,其中 1.0 表示无变化。
android:toYScale
浮点数。结束 Y 尺寸偏移,其中 1.0 表示无变化。
android:pivotX
浮点数。当对象缩放时保持固定的 X 坐标。
android:pivotY
浮点数。当对象缩放时保持固定的 Y 坐标。

有关 <scale> 支持的更多属性,请参阅 Animation 的类参考,此元素的 XML 属性继承自该类。

<translate>
垂直和/或水平运动。表示一个 TranslateAnimation。支持以下三种格式的属性:
  • -100 到 100 的值,以 "%" 结尾,表示相对于自身的百分比。
  • -100 到 100 的值,以 "%p" 结尾,表示相对于其父级的百分比。
  • 不带后缀的浮点值,表示绝对值。

属性

android:fromXDelta
浮点数或百分比。起始 X 偏移。表示为相对于正常位置的像素,例如 "5";相对于元素宽度的百分比,例如 "5%";或相对于父级宽度的百分比,例如 "5%p"
android:toXDelta
浮点数或百分比。结束 X 偏移。表示为相对于正常位置的像素,例如 "5";相对于元素宽度的百分比,例如 "5%";或相对于父级宽度的百分比,例如 "5%p"
android:fromYDelta
浮点数或百分比。起始 Y 偏移。表示为相对于正常位置的像素,例如 "5";相对于元素高度的百分比,例如 "5%";或相对于父级高度的百分比,例如 "5%p"
android:toYDelta
浮点数或百分比。结束 Y 偏移。表示为相对于正常位置的像素,例如 "5";相对于元素高度的百分比,例如 "5%";或相对于父级高度的百分比,例如 "5%p"

有关 <translate> 支持的更多属性,请参阅 Animation 的类参考,此元素的 XML 属性继承自该类。

<rotate>
旋转动画。表示一个 RotateAnimation

属性

android:fromDegrees
浮点数。起始角度位置,以度为单位。
android:toDegrees
浮点数。结束角度位置,以度为单位。
android:pivotX
浮点数或百分比。旋转中心的 X 坐标。表示为相对于对象左边缘的像素,例如 "5";相对于对象左边缘的百分比,例如 "5%";或相对于父容器左边缘的百分比,例如 "5%p"
android:pivotY
浮点数或百分比。旋转中心的 Y 坐标。表示为相对于对象上边缘的像素,例如 "5";相对于对象上边缘的百分比,例如 "5%";或相对于父容器上边缘的百分比,例如 "5%p"

有关 <rotate> 支持的更多属性,请参阅 Animation 的类参考,此元素的 XML 属性继承自该类。

示例

XML 文件保存在 res/anim/hyperspace_jump.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <scale
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="1.4"
        android:fromYScale="1.0"
        android:toYScale="0.6"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false"
        android:duration="700" />
    <set
        android:interpolator="@android:anim/accelerate_interpolator"
        android:startOffset="700">
        <scale
            android:fromXScale="1.4"
            android:toXScale="0.0"
            android:fromYScale="0.6"
            android:toYScale="0.0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:duration="400" />
        <rotate
            android:fromDegrees="0"
            android:toDegrees="-45"
            android:toYScale="0.0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:duration="400" />
    </set>
</set>

以下应用代码将动画应用于 ImageView 并启动动画:

Kotlin

val image: ImageView = findViewById(R.id.image)
val hyperspaceJump: Animation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump)
image.startAnimation(hyperspaceJump)

Java

ImageView image = (ImageView) findViewById(R.id.image);
Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
image.startAnimation(hyperspaceJump);
另请参阅

插值器

插值器是 XML 中定义的动画修改器,它影响动画的变化率。这使您的现有动画效果能够加速、减速、重复、反弹等。

插值器通过 android:interpolator 属性应用于动画元素,该属性的值是对插值器资源的引用。

Android 中所有可用的插值器都是 Interpolator 类的子类。对于每个插值器类,Android 都包含一个公共资源,您可以使用 android:interpolator 属性引用该资源以将插值器应用于动画。下表指定了每个插值器要使用的资源:

插值器类资源 ID
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator
AccelerateInterpolator @android:anim/accelerate_interpolator
AnticipateInterpolator @android:anim/anticipate_interpolator
AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator
BounceInterpolator @android:anim/bounce_interpolator
CycleInterpolator @android:anim/cycle_interpolator
DecelerateInterpolator @android:anim/decelerate_interpolator
LinearInterpolator @android:anim/linear_interpolator
OvershootInterpolator @android:anim/overshoot_interpolator

以下是使用 android:interpolator 属性应用其中一个的方法:

<set android:interpolator="@android:anim/accelerate_interpolator">
    ...
</set>

自定义插值器

如果您对平台提供的插值器不满意,可以创建具有修改属性的自定义插值器资源。例如,您可以调整 AnticipateInterpolator 的加速率,或调整 CycleInterpolator 的循环次数。为此,您可以在 XML 文件中创建自己的插值器资源。

文件位置
res/anim/filename.xml
文件名用作资源 ID。
编译后的资源数据类型
指向相应插值器对象的资源指针
资源引用
在 XML 中:@[package:]anim/filename
语法
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
    android:attribute_name="value"
    />

如果您不应用任何属性,则您的插值器功能与上表中列出的平台提供的插值器完全相同。

元素
请注意,每个 Interpolator 实现(在 XML 中定义时)的名称都以小写字母开头。

<accelerateDecelerateInterpolator>
变化率开始和结束缓慢,但在中间加速。

无属性。

<accelerateInterpolator>
变化率开始缓慢,然后加速。

属性

android:factor
浮点数。加速率。默认值为 1。
<anticipateInterpolator>
变化开始向后,然后向前抛出。

属性

android:tension
浮点数。要施加的张力。默认值为 2。
<anticipateOvershootInterpolator>
变化开始向后,然后向前抛出并超出目标值,然后稳定在最终值。

属性

android:tension
浮点数。要施加的张力。默认值为 2。
android:extraTension
浮点数。用于乘以张力的量。默认值为 1.5。
<bounceInterpolator>
变化在最后反弹。

无属性

<cycleInterpolator>
将动画重复指定次数的循环。变化率遵循正弦模式。

属性

android:cycles
整数。循环次数。默认值为 1。
<decelerateInterpolator>
变化率开始很快,然后减速。

属性

android:factor
浮点数。减速率。默认值为 1。
<linearInterpolator>
变化率是恒定的。

无属性。

<overshootInterpolator>
变化向前抛出并超出最后一个值,然后返回。

属性

android:tension
浮点数。要施加的张力。默认值为 2。
示例

XML 文件保存在 res/anim/my_overshoot_interpolator.xml

<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:tension="7.0"
    />

此动画 XML 应用了插值器:

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@anim/my_overshoot_interpolator"
    android:fromXScale="1.0"
    android:toXScale="3.0"
    android:fromYScale="1.0"
    android:toYScale="3.0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="700" />

逐帧动画

在 XML 中定义的动画,按顺序显示一系列图像,就像电影一样。

文件位置
res/drawable/filename.xml
文件名用作资源 ID。
编译后的资源数据类型
指向 AnimationDrawable 的资源指针
资源引用
在 Java 中:R.drawable.filename
在 XML 中:@[package:]drawable.filename
语法
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource_name"
        android:duration="integer" />
</animation-list>
元素
<animation-list>
必需。这必须是根元素。包含一个或多个 <item> 元素。

属性

android:oneshot
布尔值。如果您希望动画只执行一次,则为 "true";要循环播放动画,则为 "false"
<item>
动画的单个帧。必须是 <animation-list> 元素的子元素。

属性

android:drawable
Drawable 资源。此帧要使用的可绘制对象。
android:duration
整数。显示此帧的持续时间,以毫秒为单位。
示例

XML 文件保存在 res/drawable/rocket_thrust.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

以下应用代码将动画设置为 View 的背景,然后播放动画:

Kotlin

val rocketImage: ImageView = findViewById(R.id.rocket_image)
rocketImage.setBackgroundResource(R.drawable.rocket_thrust)

val rocketAnimation = rocketImage.background
if (rocketAnimation is Animatable) {
    rocketAnimation.start()
}

Java

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);

rocketAnimation = rocketImage.getBackground();
if (rocketAnimation instanceof Animatable) {
    ((Animatable)rocketAnimation).start();
}
另请参阅