视图动画

尝试 Compose 方法
Jetpack Compose 是 Android 推荐的 UI 工具包。学习如何在 Compose 中使用动画。

你可以使用视图动画系统对视图执行补间动画。补间动画使用诸如起点、终点、大小、旋转以及动画的其他常见方面等信息来计算动画。

补间动画可以在视图对象的內容上执行一系列简单的变换(位置、大小、旋转和透明度)。因此,如果你有一个 TextView 对象,你可以移动、旋转、放大或缩小文本。如果它有背景图像,背景图像将与文本一起变换。animation 包 提供了补间动画中使用的所有类。

一系列动画指令定义了补间动画,这些指令由 XML 或 Android 代码定义。与定义布局一样,推荐使用 XML 文件,因为它比硬编码动画更易读、更可重用和更易于交换。在下面的示例中,我们使用 XML。(要了解有关在应用程序代码中而不是 XML 中定义动画的更多信息,请参考 AnimationSet 类和其他 Animation 子类。)

动画指令定义了你想要发生的变换、它们发生的时间以及应用它们所需的时间。变换可以是顺序的或同时的——例如,你可以让 TextView 的内容从左向右移动,然后旋转 180 度,或者你可以让文本同时移动和旋转。每个变换都带有一组特定于该变换的参数(大小更改的起始大小和结束大小、旋转的起始角度和结束角度等等),以及一组通用参数(例如,开始时间和持续时间)。要使多个变换同时发生,请为它们指定相同的时间;要使它们顺序发生,请计算前一个变换的开始时间加上持续时间。

动画 XML 文件属于 Android 项目的 res/anim/ 目录。该文件必须只有一个根元素:这将是单个 <alpha><scale><translate><rotate>、插值器元素或 <set> 元素,它包含这些元素的组(可能包括另一个 <set>)。默认情况下,所有动画指令都是同时应用的。要使它们顺序发生,必须指定 startOffset 属性,如下面的示例所示。

以下来自 ApiDemos 之一的 XML 用于拉伸,然后同时旋转和翻转视图对象。

<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.setAnimation() 将动画分配给视图。

有关 XML 语法、可用标签和属性的更多信息,请参见 动画资源

注意:无论你的动画如何移动或调整大小,保存动画的视图的边界都不会自动调整以适应它。即便如此,动画仍然会在其视图的边界之外绘制,并且不会被裁剪。但是,如果动画超过父视图的边界,则会发生裁剪。