1.先说一下 过渡动画(Transition Animation)
过度动画有3种:场景过渡动画(Scene Transition),Activity过渡动画,共享元素过渡动画(Shared Element Transition)
这一次介绍Scene Transition的简单使用,之后会写文章陆续介绍后2种.
2.Scene Transition主要用到:
Scene : 场景,简单的就是两个xml布局 , 复杂的就是有多少场景信息,就有多少布局
Transition : 动画
TransitionManager : 用go(scene) 或 go(scene , tansition) 执行场景过渡动画
3.资源文件实现方式:
final ViewGroup container = (ViewGroup) findViewById(R.id.container); //场景存放在这个viewgroupfinal TransitionInflater transitionInflater = TransitionInflater.from(this);//资源文件方式-动画效果在R.transition.transition_manager中transitionManager = transitionInflater.inflateTransitionManager(R.transition.transition_manager , container);//场景( Scene.getSceneForLayout( viewgroup container , int id , context this);//加载场景)scene1 = Scene.getSceneForLayout(container , R.layout.scene_before , this);scene2 = Scene.getSceneForLayout(container , R.layout.scene_after , this);go1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (i == 0) {//资源文件方式-用transitionmanager(执行场景scene),因为动画效果在manager中transitionManager.go(scene2);i = 1;} else {transitionManager.go(scene1);i = 0;}}
activity布局如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:orientation="vertical"android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/container"><!--<include layout="@layout/scene_before"/>--></LinearLayout><Buttonandroid:id="@+id/go2"android:text="go2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentStart="true"android:layout_marginBottom="11dp" /><Buttonandroid:id="@+id/go1"android:text="go1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_above="@+id/go2"android:layout_alignParentStart="true"android:layout_marginBottom="21dp" /></RelativeLayout>
R.transition.transition_manager如下:
<?xml version="1.0" encoding="utf-8"?>
<transitionManager xmlns:android="http://schemas.android.com/apk/res/android"><transitionandroid:fromScene="@layout/scene_before"android:toScene="@layout/scene_after"android:transition="@transition/slow_auto_transition"/></transitionManager>
动画效果资源文件R.transition.slow_auto_transition如下:
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"android:transitionOrdering="sequential"><fadeandroid:fadingMode="fade_out"android:duration="5000"/><changeBoundsandroid:duration="5000"android:interpolator="@android:interpolator/anticipate_overshoot"/><fadeandroid:fadingMode="fade_in"android:duration="5000"/><!--自定义动画效果资源文件,直接在manager资源中使用,但是duration设置好像没起作用,不知道为什么
也可以用代码写动画效果,duration有作用,而且更方便
--></transitionSet>
4.代码实现方式:
//代码方式-动画效果//具体的动画效果//常用的有:幻灯片 Slide,淡入淡出 Fade//ChangeBounds 检测view的位置边界创建移动和缩放动画ChangeBounds changeBounds = new ChangeBounds();changeBounds.setDuration(500); //duration有作用,在资源文件中写的duration好像不起作用//慢慢单个浮现Fade fadeout = new Fade(Fade.OUT); //设置场景第一次被加载到viewgroup的效果fadeout.setDuration(500);//慢慢全部浮现Fade fadein = new Fade(Fade.IN);fadein.setDuration(500);//默认是从下往上滑出Slide slide = new Slide(); //不能和fade同时使用,也不能和changbounds同时使用slide.setDuration(500);final TransitionSet transition = new TransitionSet(); //代码创建的动画效果transitiontransition.setOrdering(TransitionSet.ORDERING_SEQUENTIAL);transition//.addTransition(fadeout)//.addTransition(changeBounds)//.addTransition(fadein).addTransition(slide);go2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//代码方式-用transitionmanager(执行场景scene和动画tansition)if (i == 0) {TransitionManager.go(scene2 , transition);i = 1;} else {TransitionManager.go(scene1 , transition);i = 0;}}});
5.两个场景布局如下:
scene_before.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/scene"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:id="@+id/textview"android:text="helloworld"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/gobutton"android:text="button_go"android:layout_width="wrap_content"android:layout_height="wrap_content" /><!--text的值会在动画执行过程中自动改变,如果两个布局中对应的控件的text不一样--></RelativeLayout>
scene_after.xml :
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/scene"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:id="@+id/textview"android:text="helloworld"android:layout_width="wrap_content"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/gobutton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="button_go00000000"android:layout_below="@+id/textview"android:layout_marginTop="200dp"/> <!--text的值会在动画执行过程中自动改变,如果两个布局中对应的控件的text不一样--></RelativeLayout>