Transition过渡动画
顾名思义
比如一个当前屏幕状态(Scene)中一个正方形长50dp,切换到另一个屏幕状态(Scene)对应正方形长度长100dp,长度变化就是渐变的,有过渡的,而不是突然地
先看Transition相关类
Scene 屏幕状态类,包含了当前屏幕的信息,包括控件的大小,位置,颜色背景
如何获得
Scene scene1 =Scene.getSceneForLayout(SceneRoot,R.layout.transition_scene1,this);第一个参数是Scene界定的区域,是一个(View)ViewGroup,第二个就是布局,跟平时的main.xml没有什么不同,也是定义了几个控件和他们的相关信息,换了名字而已不要被迷惑
TransitionManager Transtion管理者选定当从屏幕状态A切换到屏幕状态B所使用的过渡动画,可以在xml定义好几组呢
建议从xml中定义,在代码中初始化
Layout/
R.anim.transitions_mgr
<transitionManager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <transition app:fromScene="@layout/transition_scene1" app:toScene="@layout/transition_scene2" app:transition="@anim/changebounds"/> <transition app:fromScene="@layout/transition_scene2" app:toScene="@layout/transition_scene1" app:transition="@anim/changebounds"/> <transition app:toScene="@layout/transition_scene3" app:transition="@anim/changebounds_fadein_together"/> <transition app:fromScene="@layout/transition_scene3" app:toScene="@layout/transition_scene1" app:transition="@anim/changebounds_fadeout_sequential"/> <transition app:fromScene="@layout/transition_scene3" app:toScene="@layout/transition_scene2" app:transition="@anim/changebounds_fadeout_sequential"/> transitionManager>这里定义了五组Scene变化,从scene1到scene2,从scene2到scene1,从任意到scene3,从scene3到scene1,从scene3到scene2,
者五个屏幕变化用了数个不同的过渡动画,过渡动画不同,过渡的样子不同
如果在Activity中代码切换了从scene1到scene2,那么就会调用changebounds这个过渡动画进行过渡
TransitionInflater 能够从xml把TransitionManager从生成出来
TransitionInflater inflater=TransitionInflater.from(MainActivity.this);//获取实例
mTransitionManager = inflater.inflateTransitionManager(R.anim.transitions_mgr, mSceneRoot); /**第一个参数就是TransitionManager的xml形式,第二个参数就是动画所发生的ViewGroup位置,
毕竟变化是有范围的,**/
如何变化??
TransitionManager.transitionTo(Scene2),先假设从scene1到scene2吧,这样根据TransitionManager中的组,
启用changebounds这个过渡动画,注意这个方法传入了新的scene,与下面的不同
changebounds.xml
xml version="1.0" encoding="utf-8"?> <changeBounds/>
是的就是这么一点,改变目标视图属性,
changebounds_fadein_together.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <changeBounds/> <fade app:fadingMode="fade_in" > <targets> <target app:targetId="@id/grayscaleContainer" /> targets> fade> transitionSet>这个也没什么复杂,根属性是一个TransitionSet意义为过渡动画集,定义了一个changebounds和一个fade_in(淡入动画),且该淡入动画目标id是
grayscaleContainer,说明这个新来的屏幕状态比上一个多点东西啊,需要淡入动画来展现
TransitionManager.beginDelayedTransition(sceneRoot,transition)
调用这个方法说明变化的东西不是很复杂,这个方法先回捕获当前屏幕状态值,等你改变控件的参数后比如大小,再捕获一次当前屏幕状态值
,然后用动画来过渡这种变化,第二个参数可以为null,表示调用默认的过渡动画AutoTransition,这无关竟要啦.
重要的是,他没有传入一个新的scene,适用于没传入新的scene
建议定义一个初始布局有按钮和普通的view带大小和颜色,按钮用于切换scene,然后定义一个布局有按钮和普通的view带大小和颜色,这两个布局
对应的控件id相同,但属性不同,按钮就是切换scene功能,获取这两个布局对应的scene1,scene2,
显然需要在manager中定义两组动画,两组动画都是changebounds吧,就能看到渐变了,注意可以制定viewgroup不把按钮包括进去
参考博客:
http://blog.csdn.net/Mycroft_Wong/article/details/51790960