您可以使用视图动画系统对视图执行补间动画。补间动画会根据起点、终点、大小、旋转和其他动画的常见方面的信息计算动画。
补间动画可以对 View 对象的内容执行一系列简单的变换(位置、大小、旋转和透明度)。因此,如果您有一个 TextView
对象,您可以移动、旋转、放大或缩小文本。如果它有背景图片,背景图片将与文本一起变换。 animation package
提供补间动画中使用的所有类。
一系列动画指令定义了补间动画,这些指令可以通过 XML 或 Android 代码定义。与定义布局一样,推荐使用 XML 文件,因为它比硬编码动画更具可读性、可重用性和可替换性。在下面的示例中,我们使用 XML。(要详细了解如何在应用代码而不是 XML 中定义动画,请参阅 AnimationSet
类和其他 Animation
子类。)
动画指令定义了您希望发生的变换、发生的时机以及应用所需的时间。变换可以是顺序的或同时发生的 - 例如,您可以让 TextView 的内容从左向右移动,然后旋转 180 度,或者让文本同时移动和旋转。每个变换都有一组针对该变换的特定参数(例如,大小变化的起始大小和结束大小,旋转的起始角度和结束角度等),以及一组通用参数(例如,开始时间和持续时间)。要使几个变换同时发生,请为它们指定相同的开始时间;要使它们顺序发生,请计算开始时间加上前一个变换的持续时间。
动画 XML 文件应位于 Android 项目的 res/anim/
目录中。该文件必须有一个根元素:它可以是一个单独的 <alpha>
、<scale>
、<translate>
、<rotate>
、interpolator 元素,或者是一个包含这些元素组(可能包含另一个 <set>
)的 <set>
元素。默认情况下,所有动画指令同时应用。要使它们顺序发生,您必须指定 startOffset
属性,如下例所示。
以下来自 ApiDemos 的 XML 用于拉伸,然后同时旋转一个 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
表示变换开始缓慢,然后加速。每个插值器都有一个可在 XML 中应用的属性值。
将此 XML 保存为项目 res/anim/
目录中的 hyperspace_jump.xml
文件后,以下代码将引用它并将其应用于布局中的 ImageView
对象。
Kotlin
AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump).also { hyperspaceJumpAnimation -> findViewById<ImageView>(R.id.spaceshipImage).startAnimation(hyperspaceJumpAnimation) }
Java
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); spaceshipImage.startAnimation(hyperspaceJumpAnimation);
作为 startAnimation()
的替代方法,您可以使用
定义动画的开始时间,然后使用 Animation.setStartTime()
将动画分配给 View。View.setAnimation()
有关 XML 语法、可用标签和属性的更多信息,请参阅动画资源。
注意:无论您的动画如何移动或调整大小,包含动画的 View 的边界都不会自动调整以适应动画。即使如此,动画仍将绘制在其 View 的边界之外,并且不会被裁剪。但是,如果动画超出父 View 的边界,则会发生裁剪。