Android Transition框架全解析
目录
1 Android Transition框架... 2
1.1 Transition的综述... 2
1.2 Transition框架的限制... 2
2 Scene. 3
2.1 Scene简介... 3
2.2 创建Scene. 3
2.2.1 通过XML创建Scene. 3
2.2.2 通过代码创建Scene. 4
3 Transition——场景过渡动画... 4
3.1 场景过渡动画... 4
3.2 动画效果的触发... 5
3.2.1 Transition的属性... 6
3.2.2 界面切换的代码实现:... 7
3.2.3 界面切换的XML文件实现:... 9
3.2.4 直接在主题<style>标签里添加类似如下代码:... 10
3.3 Transition的几个类... 10
3.4 Fragment的transition. 12
3.5 Fragment之间的切换... 13
3.5.1 设置进入和退出时的动画... 13
3.5.2 启动Fragment13
1 Android Transition框架
1.1 Transition的综述
Android4.4引入了Scenes和Transition,Scene保存了布局的状态,包括所有的控件和控件的属性。布局可以是一个简单的视图控件或者复杂的视图树和子布局。保存了这个布局状态到Scene后,我们就可以从另一个场景变化到该场景。从一个场景到另一个场景的变化会有动画效果,这些动画信息就保存在Transition对象中。要运动动画就要使用TransitionManager来应用Transition。
Android5.0(API21)提供了更加丰富的内建Transition效果,例如Slide、Explode等,并且提出了Activity/Fragment间切换的Transition、携带共享的view进行跳转。
虽然Transition框架带来了一系列酷炫的效果,但由于该框架只能在Android4.4以上只用,导致现下许多旧版本的手机不支持该效果,以致transition应用的不常见。而开源库Transitions-Everywhere做到兼容Android2.2?4.0?+。
注:Transition-Everywhere的使用:
首先是在 Gradle 中引入
dependencies{
compile"com.andkulikov:transitionseverywhere:1.6.5"
}
将所有类包名为android.transition.* 的替代com.transitionseverywhere.*
1.2 Transition框架的限制
(1) 如果将Transition应用在一个SurfaceView上,可能会造成不正常的显示。SurfaceView是在非UI线程更新的,因此在UI线程执行动画时,SurfaceView可能不会被实时同步。
(2) TextureView与一般的transition相容,但transition中依赖于viewOverlay(叠加层)的功能(如fade)与textureView不兼容,viewOverlay不适用于Textureview。
注:TextureView可以用来显示内容流,内容流例如是视频或OpenGl场景,来自本应用程序以及其他进程。与SurfaceView相比,TextureView不会创建一个单独的窗口,这使得它可以像一般的View一样执行一些变换操作。
(3) AdapterView的子类,比如ListView并不适应于Transition框架。
(4) 如果尝试使用动画调整TextView大小,文本将在对象完成大小调整之前弹出到新的位置。为避免此问题,不要为包含文本的视图调整大小。
2 Scene
2.1 Scene简介
一个Scene保存了一个视图层级结构,包括它所有的views以及views的状态。Transition框架可以实现在starting scene和ending scene之间执行动画。起始场景通常是从当前布局自动确定的,我们只需要创建ending scene。Transition框架允许我们通过XML文件或Java代码创建一个Scene。两种方式都需要使用Scene类。
2.2 创建Scene
2.2.1 通过XML创建Scene
XML创建主要用于静态视图,生成的场景表示创建Scene实例时视图层级结构的状态。如果视图层级结构发生改变,则必须重新创建Scene。此方法只能以整个layout文件的师徒层级结构创建Scene,不能只用某一部分来创建。
创建步骤:(注意那些ID)
(1) 定义layout布局
(2) 获取一个View对象来充当Scene对象的根视图参数:
private FrameLayout sceneRoot;
sceneRoot=(FrameLayout)findViewById(R.id.activityA_layout);
(3) 使用定义好的布局文件生成Scene对象:Scene.getSceneForLayout方法
Scene scene1=Scene.getSceneForLayout(sceneRoot,R.layout.activityB,this);
第1个参数:被创建Scene中所有viewhierarchy的根视图(Root View)
第2个参数:需要被加载到Scene对象中的布局文件ID
第3个参数:上下文对象Context
(4) 进行跳转:TransitionManager.go(scene,newSlide());//如果这个scene是一个activity的布局,按back键是回不到上一个Activity的;并且即使视图是正确的但是按钮等都是失效的,因为跳转后并不是一个真正的Activity。
2.2.2 通过代码创建Scene
调用构造方法(Scene(sceneRoot, viewHierarchi))来new Scene对象,
同样要根视图:
mSceneRoot =(ViewGroup) mSomeLayoutElement;
mViewHierarchy = (ViewGroup)someOtherLayoutElement;
Scene mScene = new Scene(mSceneRoot, mViewHier