动画简介

尝试 Compose 方式
Jetpack Compose 是推荐用于 Android 的界面工具包。了解如何在 Compose 中使用动画。

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

Android 包含不同的 Animation API,具体取决于您想要的动画类型。本文档简要介绍了为界面添加动作的不同方式。

如需更好地了解何时应使用动画,另请参阅有关动作的 Material Design 指南。

为位图添加动画

图 1. 带动画的可绘制对象。

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

例如,向用户传达两个操作相关联的一种好方法是,为播放按钮添加动画效果,使其在点按时转换为暂停按钮。

如需了解详情,请参阅为可绘制图形添加动画。

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

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

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

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

如需以最简单的方式创建这些动画,请在布局上启用动画,这样当您更改视图的可见性时,系统会自动应用动画。如需了解详情,请参阅自动为布局更新添加动画效果。

如需了解如何使用属性动画系统构建动画,请参阅属性动画概览。您还可以参阅以下页面来创建常见动画:

基于物理特性的动作

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

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

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

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

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

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

使用基于物理特性的 Animation 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 之间共享哪些视图,以便过渡框架可以在动画期间连接这些视图。

如需查看其他资源,请参阅: