动画资源可以定义两种类型的动画之一
- 属性动画
- 通过使用
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
的所有子项设置单个目标对象,作为一种便捷方式。以下代码演示了如何执行此操作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>
元素)的组(或组)。 - 元素
- 示例
-
保存在
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
并启动动画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 中定义时)的名称都以小写字母开头。 - 示例
-
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/文件名.xml
文件名用作资源ID。- 编译后的资源数据类型
- 指向
AnimationDrawable
的资源指针 - 资源引用
- 在 Java 中:
R.drawable.文件名
在 XML 中:@[包名:]drawable.文件名
- 语法
-
<?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>
- 元素
- 示例
-
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 isAnimatable
) { rocketAnimation.start()
}Java
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image); rocketImage.
setBackgroundResource
(R.drawable.rocket_thrust); rocketAnimation = rocketImage.getBackground()
; if (rocketAnimation instanceofAnimatable
) { ((Animatable)rocketAnimation).start()
; } - 另请参阅