当前位置: 代码迷 >> 综合 >> 场景过渡动画(Scene Transition)-简单使用
  详细解决方案

场景过渡动画(Scene Transition)-简单使用

热度:15   发布时间:2023-12-14 13:47:52.0

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>

6.以上都是自己测试总结的,可能不会很对。具体自行测试



  相关解决方案