一个动画资源可以定义以下两种动画类型之一:
- 属性动画
- 通过使用
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=["repeat" | "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=["repeat" | "reverse"] android:valueType=["intType" | "floatType"]/> <set> ... </set> </set>
该文件必须具有一个根元素,可以是
<set>、<objectAnimator>或<valueAnimator>。您可以将动画元素(包括其他<set>元素)组合到<set>元素中。 - 元素:
<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"可让动画在每次迭代时反向播放,设置为"repeat"则可让动画每次从头开始循环播放。 android:valueType- 关键字。如果值为颜色,则不要指定此属性。动画框架会自动处理颜色值
值 说明 intType指定动画值为整数 floatType(默认)指定动画值为浮点数
<animator>在指定的时间段内执行动画。代表 ValueAnimator。
属性:
android:valueTo浮点数、整数或颜色。必需。动画的结束值。颜色以六位十六进制数字表示(例如,#333333)。android:valueFrom浮点数、整数或颜色。必需。动画的开始值。颜色以六位十六进制数字表示(例如,#333333)。android:duration整数。动画的时间,以毫秒为单位。默认为 300ms。android:startOffset整数。调用 start() 后动画延迟的毫秒数。。android:repeatCount整数。动画的重复次数。设为 "-1" 表示无限次重复,也可设为正整数。例如,值 "1" 表示动画在初次播放后重复播放一次,因此动画总共播放两次。默认值为 "0",表示不重复。android:repeatMode整数。动画播放到结尾处的行为。android:repeatCount 必须设置为正整数或 "-1",该属性才有效。设置为 "reverse" 可让动画在每次迭代时反向播放,设置为 "repeat" 则可让动画每次从头开始循环播放。android:valueType关键字。如果值为颜色,则不要指定此属性。动画框架会自动处理颜色值。
| 值 | 说明 |
|---|---|
intType |
指定动画值为整数 |
floatType(默认) |
指定动画值为浮点数 |
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 的所有子项的目标对象。以下代码展示了如何执行此操作:
java代码:
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.animator.property_animator);
set.setTarget(myObject);
set.start();
kotlin代码:
val set: AnimatorSet = AnimatorInflater.loadAnimator(myContext, R.animator.property_animator)
.apply {
setTarget(myObject)
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>元素。 - 元素:
- 示例:
- 保存在
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并启动动画:java 代码: ImageView image = (ImageView) findViewById(R.id.image); Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); image.startAnimation(hyperspaceJump); kotlin 代码: val image: ImageView = findViewById(R.id.image) val hyperspaceJump: Animation = 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实现的名称都以小写字母开头。属性:
android:cycles- 整数。循环次数(默认值为 1)。
<decelerateInterpolator>- 变化率开始时很快,然后减慢。
属性:
android:factor- 浮点数。减速率(默认值为 1)。
<linearInterpolator>- 变化率恒定不变。
没有属性。
<overshootInterpolator>- 先急速正向变化,再超过最终值,然后回到最终值。
属性:
android:tension- 浮点数。要应用的张力(默认为 2)。
保存在 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.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 的背景,然后播放动画:
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(); } 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() }- 保存在