欢迎参加我们将于 6 月 3 日举行的 #Android11:Beta 版发布会

动画概览

您可以通过动画添加视觉提示,向用户通知应用中的动态。当界面状态发生改变时(例如有新内容加载或有新操作可用时),动画尤其有用。动画还为应用增加了优美的外观,使其拥有更高品质的外观和风格。

Android 根据您需要的动画类型提供不同的动画 API,因此本页概括介绍了向界面添加动作的不同方法。

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

为位图添加动画

图 1. 带动画的可绘制资源

要为位图图形(例如图标或插图)添加动画,应使用可绘制资源动画 API。通常,这些动画是使用可绘制资源进行静态定义的,但您也可以定义运行时的动画行为。

例如,如果在点按播放按钮后以动画的方式转换为暂停按钮,就能很好地告诉用户这两个操作是相关的,按一个按钮会使另一个按钮显示出来。

有关详情,请参阅为可绘制图形添加动画

为界面可见性和动作添加动画

图 2. 在对话框出现和消失时采用巧妙的动画效果会让界面变化显得不那么突兀

当您需要更改视图在布局中的可见性或位置时,您应该加入巧妙的动画效果来帮助用户了解界面的变化情况。

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

要以最省力的方式创建这些动画,您可以在布局上启用动画,这样当您只是更改视图的可见性时,动画就会自动应用。有关详情,请参阅自动为布局更新添加动画

要了解如何使用属性动画系统构建动画,请参阅属性动画概览。 或者查看以下页面来创建常用动画:

基于物理特性的动作

图 3. 使用 ObjectAnimator 构建的动画

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

您的动画应尽可能运用现实世界的物理定律,以使其看起来更自然。例如,它们应在目标发生变化时保持动量,并在任何变化期间进行平稳过渡。

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

以下是两种常见的基于物理特性的动画:

非基于物理特性的动画(例如使用 ObjectAnimator API 构建的动画)是完全静态的,并且具有固定的持续时间。如果目标值发生变化,则需要在目标值更改时取消动画,使用新值作为新起始值重新配置动画,并添加新目标值。在视觉上,此过程会导致动画突然停止,之后会出现不连贯的运动,如图 3 所示。

然而,使用基于物理特性的动画 API(例如 DynamicAnimation)构建的动画是依靠力来驱动的。目标值的变化会导致力的变化。新力作用于现有速度,从而实现以连续的方式过渡到新目标。此过程使动画看起来更加自然,如图 4 所示。

为布局更改添加动画

图 5. 用于显示更多详情的动画可以通过更改布局或启动新 Activity 来实现

在 Android 4.4(API 级别 19)及更高版本中,您可以使用过渡框架来创建在当前 Activity 或 Fragment 内切换布局时的动画。 您只需指定起始和结束布局以及要使用的动画类型。然后,系统会找出并执行这两种布局之间的动画。您可以使用这种方法换掉整个界面,也可以只移动/替换部分视图。

例如,当用户点按某项内容以查看更多信息时,您可以将布局替换为项目详情,应用类似于图 5 所示的过渡。

起始和结束布局分别存储在一个 Scene 中,但起始场景通常是根据当前布局自动确定的。然后您要创建一个 Transition 来告诉系统您所需的动画类型,再调用 TransitionManager.go(),系统便会运行动画来切换布局。

有关详情,请参阅使用过渡在布局之间添加动画。有关示例代码,请查看 BasicTransition

在 Activity 之间添加动画

在 Android 5.0(API 级别 21)及更高版本中,您还可以创建在您的 Activity 之间过渡的动画。此功能基于上述为布局更改添加动画的相同过渡框架,但它允许您在独立 Activity 中的布局之间创建动画。

您可以应用简单的动画,例如从侧面滑入新 Activity 或将其淡入,但您也可以创建在每个 Activity 中的共享视图之间过渡的动画。例如,当用户点按某项内容以查看更多信息时,您可以通过动画使该项内容无缝增大以填充屏幕,从而过渡到新的 Activity,类似于图 5 所示的动画。

您照常调用 startActivity(),但是向其传递 ActivityOptions.makeSceneTransitionAnimation() 提供的一组选项。这组选项可能包括在 Activity 之间共享哪些视图,以便过渡框架可以在动画期间连接它们。

有关所有详细信息,请参阅使用动画启动 Activity。有关示例代码,请查看 ActivitySceneTransitionBasic