动画可以添加视觉提示,通知用户应用中发生了什么。当UI状态发生变化时,它们尤其有用,例如加载新内容或新的操作可用时。动画还可以为你的应用增添精致的外观,使其具有更高质量的外观和感觉。
Android 包含不同的动画 API,具体取决于你想要哪种类型的动画。本文档概述了向 UI 添加运动的不同方法。
为了更好地理解何时应该使用动画,还可以参阅关于运动的 Material Design 指南。
动画位图
要为位图图形(例如图标或插图)制作动画,请使用 drawable 动画 API。通常,这些动画使用 drawable 资源静态定义,但你也可以在运行时定义动画行为。
例如,一种向用户传达两个操作相关的好方法是为播放按钮制作动画,当点击它时,它会转换为暂停按钮。
更多信息,请阅读动画drawable图形。
动画UI可见性和运动
当你需要更改布局中视图的可见性或位置时,最好包含细微的动画来帮助用户理解UI是如何变化的。
要移动、显示或隐藏当前布局中的视图,可以使用android.animation
包(在Android 3.0(API级别11)及更高版本中可用)提供的属性动画系统。这些API会随着时间的推移更新你的View
对象的属性,并在属性更改时不断重绘视图。例如,当你更改位置属性时,视图会在屏幕上移动。当你更改alpha属性时,视图会淡入或淡出。
对于创建这些动画的最简单方法,请在你的布局上启用动画,以便当你更改视图的可见性时,动画会自动应用。更多信息,请参阅自动动画布局更新。
要了解如何使用属性动画系统构建动画,请阅读属性动画概述。你还可以查看以下页面以创建常见的动画
基于物理的运动
尽可能将现实世界的物理学应用于你的动画,使其看起来自然。例如,当它们的目標发生变化时,它们应该保持动量,并在任何变化过程中进行平滑过渡。
为了提供这些行为,Android支持库包含基于物理的动画API,这些API依靠物理定律来控制动画的发生方式。
两种常见的基于物理的动画如下
不基于物理的动画(例如使用ObjectAnimator
API构建的动画)相当静态,并且持续时间固定。如果目标值发生变化,则必须在目标值变化时取消动画,使用新值作为新起始值重新配置动画,并添加新目标值。从视觉上看,此过程会在动画中造成突然停止,并在之后造成不连贯的运动,如图3所示。
使用基于物理的动画API(例如DynamicAnimation
)构建的动画由力驱动。目标值的改变导致力的改变。新的力作用于现有速度,从而使向新目标的过渡连续进行。此过程会产生更自然的动画,如图4所示。
动画布局变化
在Android 4.4(API级别19)及更高版本中,你可以在当前活动或片段内交换布局时使用转换框架来创建动画。你只需指定起始和结束布局以及要使用的动画类型即可。然后,系统会找出并在两个布局之间执行动画。你可以使用它来交换整个UI,或者只是移动或替换一些视图。
例如,当用户点击某个项目以查看更多信息时,你可以使用该项目详细信息替换布局,并应用如图5所示的转换。
起始和结束布局分别存储在Scene
中,但起始场景通常会从当前布局自动确定。你创建一个Transition
来告诉系统你想要哪种类型的动画,然后调用TransitionManager.go()
,系统就会运行动画来交换布局。
更多信息,请阅读使用转换动画布局更改。有关示例代码,请查看BasicTransition。
在活动之间动画
在Android 5.0(API级别21)及更高版本中,你还可以创建在活动之间转换的动画。这基于上一节中描述的相同转换框架,但它允许你在*单独的活动*中的布局之间创建动画。
你可以应用简单的动画,例如从侧面滑入新活动或淡入新活动,但你还可以创建在每个活动中的共享视图之间转换的动画。例如,当用户点击某个项目以查看更多信息时,你可以使用动画转换到一个新活动,该动画会无缝地将该项目放大以填充屏幕,就像图5所示的动画一样。
和往常一样,您调用startActivity()
,但是传入由ActivityOptions.makeSceneTransitionAnimation()
提供的选项包。此选项包可能包含活动之间共享的视图,以便转换框架可以在动画期间连接它们。
更多资源,请参见