Android Transition 和 Activity & Fragment Transition详解(二)--Android Transition框架介绍

来源:互联网 发布:工业设计常用建模软件 编辑:程序博客网 时间:2024/04/30 09:51

灵感来自:https://developer.android.com/training/transitions/overview.html 再吐槽一下,谷歌的官方文档是学习Android最权威的网站。作为一个Android攻城狮,每当学习一个新的API时,如果不先查看谷歌文档而是直接莆田百度,那造成的结果很有可能是你的语文是体育老师教的。


研发一款App时,经常要考虑使用动画效果,除了达到炫酷效果的同时,有时候动画还能帮助用户更好的理解如何使用App。在KitKat之前,我们已经了解了其它多个动画的使用,包括补间动画,帧动画,属性动画等等。在KitKat版本中,Android为了帮助我们更好的实现不同view视图间的动画效果,引入的Transition框架的概念。

这个框架实现了当一个view树中的一个或者多个view发生变化时,可以执行一个或者多个animation,具体包含了以下几个特征:

1) 可以对一个view树中所有的视图执行一个或者多个动画

2) 根据一个view的起始属性的变化值来执行一个动画

3) Android SDK中内置了多个预定义的动画效果,比如fade(透明度)动画和movement(移动)动画

4) 动画的定义可以在xml文件中定义,然后通过java代码动态的加载动画

5) 在执行某一个动画时,我们可以添加相应的回调方法监听动画执行的过程

Fugure1

上图展示了如何通过一个动画效果提示用户相关信息:当用户在搜索界面点击输入"Halogen",然后点击搜索按钮之后,搜索界面会逐渐淡出,同时搜索结果界面会逐渐的淡入直到完全显示到手机屏幕上。这种效果就可以使用Transition框架来实现,思路如下:Transition执行了两个Activity view树的动画效果,第一个就是将搜索界面所有的view的alpha属性,在一段时间内由1到0,然后第二个就是将搜索结果的界面所有的view的alpha属性在一段时间内由0设置为1。 并且这两个动画效果是同时进行的。Transition运行的原理就是当用户点击搜索按钮时,Transition会记录下两个Activity中(搜索界面和搜索结果界面)需要被改变的view的起始状态(alpha 0~1 或者 alpha 1~0),有了起点和终点状态之后,就可以在一段时间内同时执行一个animation来改变相应的属性。如下图所示:



那么问题来了 ? Android系统将view的状态保存在哪里呢? 又是如何执行的呢?为了解决这些问题,Android SDK新引入了三个概念:Scene    Transition    TransitionManager

当你在你的代码中需要使用Transition框架时,可以通过为你的某一个界面中的view对象创建Scene对象,view的属性以及状态就保存在此Scene对象中。下一步你需要创建Transition对象,此对象定义了执行那种动画来改变view的属性,可想而知,我们需要将之前创建的Scene对象传递给此Transition对象。最后使用TransitionManager来执行此Transition。具体的代码会在后续章节中单独展示


Scene场景

一个场景保存了一个view hierarchy的状态,包括它的所有子视图以及属性值。一个view hierarchy可以是一个view也可以是一个view树形图以及它的子控件。通过将view hierarchy的状态保存在一个场景中,再加上Transition框架,我们就可以实现从一个场景中跳转到其他场景的效果。Android SDK提供了Scene这个类来表示一个场景。

创建Scene对象有两种方式:一种是通过加载xml配置文件,另一种是java代码中动态使用ViewGroup来获取Scene对象。一般而言,如果你的View是动态生成的或者View在程序运行时有可能被动态的修改,最好使用动态生成Scene的方式。

大多数情况下,你不需要每次都创建一个Scene。为什么这么说呢 ?如果你之前已经执行过一次Transition,那么系统会使用上次的ending scene来当做后续transition的起始scene。反之,如果之前并没有执行过任何一个Transition,系统会将当前屏幕上所展示的view来当做后续Transition的起始scene。


Transition 转换

在Transition框架中,是使用动画的方式来描绘由起点场景到终点场景所经过的变化。而这个动画的所有信息都被保存在一个Transition对象中。如果想执行这个Transition,则需要用到TransitionManager对象,通过它可以实现在不同的场景(Scene)中进行切换和变化或者从当前的场景转换到另外一个不同的状态。

Android SDK已经对于一些常用的动画效果(比如fading和resizing)封装了几种Transition,你也可以实现自定义Transition来实现其它的不同动画效果。同Activity非常相似,Transition也有自己的生命周期。Transition可以监听一个动画的起始和终止的过程,并且在此过程中会提供给我们相应的回调方法,通过实现这些抽象方法可以在不同的过程动态的修改UI界面。


局限性:

Transition框架的使用也有一定的局限性

1)如果将Transition作用到一个SurfaceView上,可能会造成不正常的显示。SurfaceView是在非UI线程更新的,因此在UI线程执行动画时,SurfaceView可能并不会被实时同步

2)当使用TextureView时,一些特定的Transition可能不会显示期望的动画效果

3)AdapterView的子类,比如ListView并不适应于Transition框架

4)如果要重新设置TextView的大小尺寸,当TextView被完全设置完之前,文本信息会重新跳转到另外一个位置。为了避免这个问题,尽量不要用动画的方式改变TextView的尺寸

0 0
原创粉丝点击