场景动画用于布局的某个子布局由一种场景布局变化为另一种场景布局时调用的动画
scene:保存视图层状态,包括所有子视图的属性值(可以通过xml 文件创建,也可以通过ViewGroop来动态加载)
transition:使用动画的方式来描绘从fromScene到toScene所经历的变化,通过transitionManager对象来实现不同scene之间的切换
- 1.创建场景
先在r/layout/下新建一个xml 文件,将场景的布局文件先定义好R.layout.scene1;
Scene mScene1 = Scene.getSceneForLayout(mSceneRoot, R.layout.scene1, this);//mSceneRoot为inClude场景的父容器(ViewGroup)
- 2.创建过渡动画transition
在res/下新建transition子目录,在res/transition/目录下新建xml文件,
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"android:transitionOrdering="sequential">//顺序可以是sequential或者是together
<!--transitionSet为transition的集合,可包含多个transition,也可以下面单个transition作为根节点--><!--捕捉前后场景中目标窗体控件的位置和布局边界的变化--><changeBounds/><changeImageTransform/>//捕捉前后场景中目标窗体控件的显示矩阵(matrix)的变化<changeTransform/>//捕捉前后场景中目标窗体控件的缩放(scale)和旋转(rotation)变化<explode/>//可见目标窗体控件,从父窗体的四周边缘移入或移除的过渡动画<fade/>//可见目标窗体控件,淡入淡出的过渡动画;<!--目标窗体控件,从父窗体的某一边缘移入或移除的过渡动画--><slide android:slideEdge="right" //移入移除的边缘android:duration="500"android:interpolator="@android:interpolator/accelerate_decelerate"><targets> //目标窗体<target android:targetId="@id/viewGroup"/></targets></slide>
</transitionSet>
- 3.通过TransitionManager控制场景和场景动画的切换
在xml中定义transitionManager res/transition/下新建xml
<?xml version="1.0" encoding="utf-8"?>
<transitionManager xmlns:android="http://schemas.android.com/apk/res/android"><!--从场景1到场景2的过渡动画--><transition android:fromScene="@layout/scene1"android:toScene="@layout/scene2"android:transition="@transition/transition1"/><!--从场景2到场景1的过渡动画--><transition android:fromScene="@layout/scene2"android:toScene="@layout/scene1"android:transition="@transition/transition1"/></transitionManager>
在代码中实例化xml中定义的transitionManager
TransitionInflater inflater = TransitionInflater.from(this);//获得transitionInflater对象
TransitionManager transitionManager=inflater.inflateTransitionManager(R.transition.my_tmanager, sceneRoot);//通过inflater将XML中定义的transitionManager实例化
实现场景的切换
transitionManager.transitionTo(scene2);//将当前场景切换到scene2 transitionManager会自动调用从scene1到scene2的动画