一个动画资源可以定义以下两种动画类型之一:
- 属性动画
- 通过使用
Animator
在设定的时段内修改对象的属性值来创建动画。 - 视图动画
-
使用视图动画框架可以创建两种类型的动画:
- 补间动画:通过使用
Animation
对单张图片执行一系列转换来创建动画。 - 帧动画:通过使用
AnimationDrawable
按顺序显示一系列图片来创建动画。
- 补间动画:通过使用
属性动画
在 XML 中定义的动画,用于在设定的一段时间内修改目标对象的属性,例如背景颜色或 alpha 值。
- 文件位置:
res/animator/filename.xml
文件名用作资源 ID。- 编译后的资源数据类型:
- 指向
ValueAnimator
、ObjectAnimator
或AnimatorSet
的资源指针 - 资源引用:
-
在 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>
元素中。 - 元素:
- 示例:
-
保存在
res/animator/property_animator.xml
的 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
的所有子项的目标对象。以下代码展示了如何执行此操作: - 另请参阅:
视图动画
视图动画框架可支持补间动画和逐帧动画,两者都是在 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>
元素。 - 元素:
- 示例:
-
保存在
res/anim/hyperspace_jump.xml
的 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
并启动动画:val image: ImageView = findViewById(R.id.image)
val hyperspaceJump: Animation = AnimationUtils.loadAnimation
(this, R.anim.hyperspace_jump)
image.startAnimation
(hyperspaceJump)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:interpolator
属性将插值器应用于动画,Android 针对每个插值器类包含了一个可供您引用的公共资源。下表指定了每个插值器要使用的资源:
插值器类 | 资源 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"
/>如果您不应用任何属性,则该插值器的运作方式与上表所列平台提供的插值器完全相同。
- 元素:
- 请注意,在 XML 中定义的每个
Interpolator
实现的名称都以小写字母开头。 - 示例:
-
保存在
res/anim/my_overshoot_interpolator.xml
的 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> - 元素:
- 示例:
-
保存在
res/drawable/rocket_thrust.xml
的 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
的背景,然后播放动画:val rocketImage: ImageView = findViewById(R.id.rocket_image)
rocketImage.setBackgroundResource
(R.drawable.rocket_thrust)
val rocketAnimation = rocketImage.background
if (rocketAnimation isAnimatable
) {
rocketAnimation.start()
}ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource
(R.drawable.rocket_thrust);
rocketAnimation = rocketImage.getBackground()
;
if (rocketAnimation instanceofAnimatable
) {
((Animatable)rocketAnimation).start()
;
} - 另请参阅: