位图动画

尝试 Compose 方式

Jetpack Compose 是 Android 推荐的 UI 工具包。了解如何在 Compose 中使用动画。

Compose 中的动画 →

动画可以添加视觉提示,告知用户应用中正在发生的事情。当 UI 状态发生变化(例如加载新内容或出现新操作)时,动画特别有用。动画还能让您的应用看起来更精致,从而提升其品质感和用户体验。

Android 提供了多种动画 API,具体取决于您想要的动画类型。本文档概述了为 UI 添加动态效果的不同方法。

要更好地了解何时应使用动画,请参阅 Material Design 动态指南。

注意:有关 Jetpack Compose 中动画的指南,请参阅 动画。

位图动画

图 1. 动画 drawable。

要为图标或插图等位图图形制作动画,请使用 drawable 动画 API。通常,这些动画通过 drawable 资源静态定义,但您也可以在运行时定义动画行为。

例如,向用户传达两个操作相关联的一种好方法是,让一个播放按钮在被点击时转换成暂停按钮,并为该过程设置动画。

如需了解更多信息,请阅读 为 drawable 图形制作动画。

UI 可见性和运动动画

图 2. 当对话框出现和消失时,微妙的动画可以减轻 UI 变化的突兀感。

当您需要更改布局中视图的可见性或位置时,最好添加微妙的动画来帮助用户理解 UI 是如何变化的。

要移动、显示或隐藏当前布局中的视图,可以使用 Android 3.0(API 级别 11)及更高版本中提供的 android.animation 包中的属性动画系统。这些 API 会在一段时间内更新 View 对象的属性,并随着属性的变化不断重绘视图。例如,当您更改位置属性时,视图会在屏幕上移动。当您更改 alpha 属性时,视图会淡入或淡出。

创建这些动画最简单的方法是在布局上启用动画,这样当您更改视图的可见性时,系统会自动应用动画。有关详细信息,请参阅 自动为布局更新设置动画。

要学习如何使用属性动画系统构建动画,请阅读 属性动画概览。您还可以查看以下页面来创建常见动画:

通过淡入淡出更改视图可见性.

通过圆形揭露效果更改视图可见性.

通过卡片翻转交换视图.

通过缩放动画更改视图大小.

基于物理的运动

图 3. 使用 ObjectAnimator 构建的动画。

图 4. 使用基于物理的 API 构建的动画。

请尽可能将现实世界的物理特性应用于您的动画,使其看起来自然。例如,它们在目标发生变化时应保持动量,并在任何更改期间实现平滑过渡。

为了提供这些行为,Android 支持库包含了基于物理的动画 API,这些 API 依靠物理定律来控制动画的执行方式。

两种常见的基于物理的动画如下:

弹簧动画 (Spring animation).

投掷动画 (Fling animation).

非基于物理的动画(例如使用 ObjectAnimator API 构建的动画)比较静态,且具有固定的持续时间。如果目标值发生变化,您必须在目标值变化时取消动画,用新值作为新的起始值重新配置动画,并添加新的目标值。在视觉上,此过程会导致动画突然停止,随后产生不连贯的运动,如图 3 所示。

使用基于物理的动画 API(例如 DynamicAnimation)构建的动画是由力驱动的。目标值的变化会导致力的变化。新的力作用于现有的速度上,从而实现向新目标的连续过渡。此过程会产生更自然的动画,如图 4 所示。

布局更改动画

图 5. 显示更多详细信息的动画可以通过更改布局或启动新 Activity 来实现。

在 Android 4.4(API 级别 19)及更高版本上,您可以使用过渡框架 (transition framework) 在当前 Activity 或 Fragment 内切换布局时创建动画。您只需指定起始和结束布局以及想要使用的动画类型。然后,系统会计算并执行两个布局之间的动画。您可以利用此功能切换整个 UI,或者仅移动或替换部分视图。

例如,当用户点击项目以查看更多信息时,您可以将布局替换为项目详情,并应用如图 5 所示的过渡效果。

起始布局和结束布局分别存储在 Scene 中,不过起始场景通常会自动从当前布局确定。您可以创建一个 Transition 来告诉系统您想要的动画类型,然后调用 TransitionManager.go(),系统就会运行布局切换动画。

如需了解更多信息,请阅读 使用过渡动画来改变布局。有关示例代码,请查看 BasicTransition。

Activity 间动画

在 Android 5.0(API 级别 21)及更高版本中,您还可以创建 Activity 之间的过渡动画。这基于上一节中描述的相同过渡框架,但它允许您在*不同的 Activity* 中的布局之间创建动画。

您可以应用简单的动画,例如从侧面滑入新 Activity 或淡入新 Activity,也可以创建在每个 Activity 的共享视图之间过渡的动画。例如,当用户点击项目以查看更多信息时,您可以过渡到一个新 Activity,并使用平滑放大该项目以填满屏幕的动画,如图 5 所示。

像往常一样,您调用 startActivity(),但要传入由 ActivityOptions.makeSceneTransitionAnimation() 提供的选项包。此选项包可能包括在各 Activity 之间共享的视图,以便过渡框架可以在动画期间连接它们。

更多资源,请参阅:

使用动画启动 Activity

ActivitySceneTransitionBasic