Activity中的用户界面常常会为了响应用户输入或者其他事件而发生变化。例如,一个可用于输入搜索关键字的输入框可以在用户输入完成点击搜索的时候隐藏起来,然后在同样的位置显示一个搜索结果的列表。
要在这种情况下保持可视效果的连续性,可以在视图结构发生改变的时候添加动画效果。这些动画可以给予用户操作良好的响应并且帮助他们更好地使用应用程序。
Android包括了Transition(转场)框架,通过它可以很容易地在视图结构发生改变时应用动画效果。该框架在运行时可以随时间动态改变view的一些属性。该框架内部包含了一些内置的动画效果,也允许自定义动画效果,还包括了一些在转场过程中的生命周期回调方法。
以下几篇翻译文章将会开始介绍如何使用Transitions框架来实现视图结构转换过程中的动画,其中也包括如何创建自定义动画。
注意:对于Android 4.0(API级别14)以上版本,对布局使用animateLayoutChanges属性来应用动画效果。
第一部分 - Transitions框架
为应用程序的用户界面添加动画效果并不仅仅是为了一些视觉效果而已。动画可以让改变变得更加醒目,这些视觉上的提示效果可以帮助用户更好的理解如何使用应用程序。
Android提供了Transitions框架用来支持视图结构改变过程中的动画效果。该框架在视图结构发生变化时会对其中的所有子View添加一个或多个动画效果。
该框架具备以下一些特性:
- 群组级别的动画:可以为整个视图结构中的所有子View添加一个或多个动画效果。
- 基于转换的动画:基于View属性的初始值和结束值来执行动画。
- 内置的动画效果:包含了预设的通用动画效果,例如渐隐或者移动。
- 支持资源文件:可以从资源文件中加载View结构和内置动画。
- 生命周期回调:为整个动画过程和视图结构变化过程提供便于控制的回调方法。
概览
图1. 使用动画效果展示的可视化提示
图1演示了动画如何通过提供可视化的提示功能来帮助用户。当应用程序从搜索关键词输入页面切换到搜索结果页面时,无用的视图效果被渐隐调,新的页面被显示出来。
这是一个使用了Transitions框架的动画效果。该框架对变化中的两个视图结构中的所有view都应用了动画效果。一个视图结构可能简单到只包括一个view或者复杂到包含到一个非常庞大的视图树形结构。该框架通过在开始视图结构和结束视图结构之间改变一个或多个属性值来实现动画效果。
Transitions框架与视图结构和动画是平行工作的。该框架的目的在于存储视图结构的属性、视图结构的变化,以便于更改其在屏幕上的显示效果,然后通过存储和应用这些属性来为这些变化添加动画。
图2展示了视图结构、框架对象和动画之间的关系:
图2. Transitions框架类关系
Transition框架提供了对于scenes(场景)、transitions(转场)和transitionsManager(转场管理器)的抽象。后面将介绍这些类的细节。使用该框架,需要为发生变化的视图结构创建场景,然后需要为每个想要使用的动画效果创建一个转场。要在两个视图结构之间启动一个动画,需要使用转场管理器来指定需要使用的转场效果和结束场景。
场景
一个场景保存了视图结构的状态,包括所有的view和他们的属性值。一个视图结构可能只有一个view或者是由非常复杂的树形结构组成。保存一个视图结构的状态可以用来从其他场景转换到该场景。框架提供了Scene类来代表一个场景。
Transitions框架允许从布局资源文件中或者在代码中通过ViewGroup来创建一个场景。通过代码来创建一个场景是有必要的,因为有时需要动态创建一个视图结构或者需要在运行时修改视图结构。
大多数情况下,不需要显式地创建一个开始场景。如果应用了一个转场,框架会把之前的结束场景用作后续转场的开始场景。如果之前没有应用过转场,框架会搜集当前屏幕中视图结构的状态作为开始场景。
一个场景也可以自定义当自身发生变化时进行的动作。例如,如果需要在转入一个新场景的时候清除View的设置,那么该特性是非常有用的。
除了视图结构和其中的属性之外,一个场景还保存了对于视图结构父容器的引用。这个父容器(根视图)被称为场景根视图(scene root)。对场景的改变和对场景应用动画效果都是在场景根视图中进行的。
转场
在Transitions框架中,动画会创建一系列的帧来描述从开始场景到结束场景的变化。动画的相关信息被保存在Transition对象中。要执行动画,需要通过一个TransitionManager实例来应用transition。框架可以在两个不同的场景之间执行转场或者在同一个场景的不同状态之间执行转场。
框架包含了一组用于通用动画效果的内置转场,例如渐隐和缩放视图。还可以通过Animation框架中的API来实现自定义的转场效果。Transitions框架同样可以组合一组独立的预设或自定义转场来实现整合的转场效果。
转场效果的生命周期与Acitivity的生命周期类似,用来代表被框架所监视的从动画开始到结束的各种状态。在重要的生命周期状态点,框架会调用相应的回调方法。可以自己实现这些接口方法以便在转场的各个阶段来对用户界面进行相应的调整。
局限性
本节将介绍一些Transitions框架的局限性:
- 对SurfaceView应用动画可能无法被正确显示。SurfaceView实例是通过一个非UI进程来更新的,所以SurfaceView的更新可能与其他的View不同步。
- 当某些专场类型被应用在TextureView上时可能无法获得预期效果
- AdapterView的子类,比如ListView,它们管理子View的方式导致无法应用转场效果。如果要对AdapterView的子类应用专场可能会知道设备显示被挂起。
- 当试图对TextView应用缩放动画的时候,其中的文本内容可能在TextView对象还没有完全完成缩放之前就跳到一个新的位置上。为了避免这个问题,不要对包含文本内容的View应用缩放动画。