View Animation
英文原文:http://developer.android.com/guide/topics/graphics/view-animation.html
版本:Android 4.0
译者注:黄色底色为未决译文
你可以用 view 动画系统在 View 上完成 Tween 动画。Tween 动画根据起点、终点、大小、旋转等信息来计算并显示动画。
Tween 动画可以让 View 中的对象完成一系列简单的变化效果(位置、大小、旋转、透明度)。因此,假设其中有一个 TextView 对象,则你可以平移、旋转、放大、缩小这些文本。如果它带有背景图片,则此图片也会随文本一起变化。 animation package 提供了 Tween 动画用到的全部类。
Tween 动画的一系列指令由 XML 或 Android 代码来定义。与定义 layout 类似,推荐使用 XML 来定义,因为可读性、复用性、互通性会比硬编码要好一些。 以下例子中,我们使用 XML。(要了解用程序代码来定义动画的有关内容,请参考 AnimationSet 类和 Animation 子类)
动画指令定义了你需要的变化效果、变化时机和持续时间。动画效果可以是串行或并行的——比如,你可以让 TextView 中的文本先从左向右移动,然后旋转180度,也可以让文字一遍移动一边旋转。 每个效果包含一组特定参数(初始大小和结束大小、旋转的起始角度和结束角度等等),以及一组通用参数(比如启动时间和持续时间)。 要实现多个效果的同时显示,只要把它们的启动时间设为同一时间即可;而要串行显示的话,需要把起始时间加上前一个效果的持续时间。
定义动画的 XML 文件位于 Android 项目的 res/anim/ 目录下。 此文件必须包含一个唯一的 root 元素:可以是一个 <alpha>、<scale>、<translate>、<rotate>、interpolator 元素、或包含了几组上述元素的<set>(其中还可继续包含 <set>)。 所有的动画指令默认是同时启动的。如果要实现串行显示,必须指定startOffset 属性,如下例所示。
以下 XML 来自 ApiDemo,先放大 View 对象,然后一边旋转一边缩成一条线。
<set 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/decelerate_interpolator">
<scale
android:fromXScale="1.4"
android:toXScale="0.0"
android:fromYScale="0.6"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="700"
android:duration="400"
android:fillBefore="false" />
<rotate
android:fromDegrees="0"
android:toDegrees="-45"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="700"
android:duration="400" />
</set>
</set
屏幕坐标(上例中未用到)(0,0) 表示左上角,坐标值向下向右递增。
某些值,比如 pivotX,可以设为相对于对象自身或相对于父对象。请根据需要选择合适的格式("50" 表示相对于父对象变化 50%,而 "50%" 表示相对于自身变化 50%)。
你可以指定 Interpolator 来定义动画的变化速度。 Android 包含了多种 Interpolator 子类,定义了各种速度曲线:比如, AccelerateInterpolator 表示一开始变化较慢,然后加速。每种 Interpolator 都包含了可在 XML 内设置的属性值。
以下代码把动画应用于 layout 中的 ImageView 对象,用到了存放于项目 res/anim/ 中的hyperspace_jump.xml。
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
除了用 startAnimation() 启动动画,你还可以换用 Animation.setStartTime() 来定义启动时机,然后用View.setAnimation() 把动画赋给 View。
关于 XML 语法的详情、支持的标记和属性,请参阅 Animation Resources