android 场景转换Scene配合动画的使用

原创 2016年08月31日 16:35:28

android Scene

   android Scene保存了view层级的状态,并保存了层级中所有view的属性值。动画框架能使用动画进行场景的切换,一般只需要制定exit(退出)动画,不需要制定enter(进入)动画,系统会自动帮我们创建进入动画。

用Layout创建一个场景

  用layout创建Scene时,一般这个layout是不变的,只有在layout创建的时候才会加载场景。如果你要改变这个layout的话,需要重新创建Scene。不能用layout的一部分来创建Scene。用layout创建Scene时需要吧Layout当做ViewGroup初始化,然后调用Scene.getSceneForLayout() 。



下面就来动手创建Scene:

主layout-res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/master_layout">
    <TextView
        android:id="@+id/title"
        ...
        android:text="Title"/>
    <FrameLayout
        android:id="@+id/scene_root">
        <include layout="@layout/a_scene" />
    </FrameLayout>
</LinearLayout>
场景一、res/layout/a_scene.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scene_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:id="@+id/text_view1
        android:text="Text Line 1" />
    <TextView
        android:id="@+id/text_view2
        android:text="Text Line 2" />
</RelativeLayout>

场景二:res/layout/another_scene.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scene_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:id="@+id/text_view2
        android:text="Text Line 2" />
    <TextView
        android:id="@+id/text_view1
        android:text="Text Line 1" />
</RelativeLayout>

现在我们就来创建Scene对象,
Scene mAScene;
Scene mAnotherScene;

//为Scene创建scene root
mSceneRoot = (ViewGroup) findViewById(R.id.scene_root);

//创建 scenes
mAScene = Scene.getSceneForLayout(mSceneRoot, R.layout.a_scene, this);
mAnotherScene =
    Scene.getSceneForLayout(mSceneRoot, R.layout.another_scene, this);

 这样场景已经创建成功,下一步就是为场景加上动作。
  场景动作在下边这些情况下用处比较大:
    1、需要加动画的view,他们不在同一个view层级中,这样就可以操作每个的view进行入场和出场动画。
    2、为那些没有自带动画效果的view加效果, 例如ListView中的子view,详情参考Limitations。
   为了保证动画的性能问题,要把他们放到线程里,然后调用 Scene.setExitAction() 或者 Scene.setEnterAction()。Framework 会在场景动画开始前调用setExitAction(),场景动画结束后调用 setEnterAction()。

场景变化

Transition类型
   AutoTransition:xml中配置<autoTransition/>,默认变化. 淡入淡出,移动 、重计算大小, views, in that order.
   Fade:xml中配置<fade/>android:fadingMode="[fade_in |fade_out |fade_in_out]"/>,淡入淡出
   ChangeBounds:<changeBounds/>移动并改变大小
一、xml创建一个Transition:
  1、工程中创建 res/transition/ 目录.
  2、创建xml资源文件
  3、加入Transition节点
res/transition/fade_transition.xml
<fade xmlns:android="http://schemas.android.com/apk/res/android" />

然后java代码中载入xml资源
Transition mFadeTransition =
        TransitionInflater.from(this).
        inflateTransition(R.transition.fade_transition);
二、代码中创建Transition
Transition mFadeTransition = new Fade();
  场景和Transition都已经创建好了,那么该怎么触发他们呢。
  系统为我们提供了TransitionManager类,我们可以通过TransitionManager.go()来把Scene和Transition融合到一块。
TransitionManager.go(mEndingScene, mFadeTransition);
  如果要融合多种变化的话可以用set来存放他们例如AutoTransiton
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:transitionOrdering="sequential">
    <fade android:fadingMode="fade_out" />
    <changeBounds />
    <fade android:fadingMode="fade_in" />
</transitionSet>

没有Scene如何使用转场动画呢

  我们不想用Scene,但是又想拥有场景动画的效果。例如:我们在ViewGroup中添加和移除View时,想要友好的提示效果。
TransitionManager.beginDelayedTransition() 可以帮我们实现这个效果。
xml资源文件res/layout/activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <EditText
        android:id="@+id/inputText"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    ...
</RelativeLayout>

java代码中使用方法如下面事例
private TextView mLabelText;
private Fade mFade;
private ViewGroup mRootView;
...

// Load the layout
this.setContentView(R.layout.activity_main);
...

// Create a new TextView and set some View properties
mLabelText = new TextView();
mLabelText.setText("Label").setId("1");

// Get the root view and create a transition
mRootView = (ViewGroup) findViewById(R.id.mainLayout);
mFade = new Fade(IN);

// Start recording changes to the view hierarchy
TransitionManager.beginDelayedTransition(mRootView, mFade);

// Add the new TextView to the view hierarchy
mRootView.addView(mLabelText);

// When the system redraws the screen to show this update,
// the framework will animate the addition as a fade in

相关文章推荐

Android共享元素场景切换动画的实现

我们知道安卓5.0系统引入了共享元素的概念,能做出非常炫酷的场景切换效果,这让人非常兴奋但是又非常蛋疼,因为低版本没法使用啊,所以今天就跟大家分享一下自己写的一个库,其实只有2个文件而已,还是叫它工具...

切换场景的特效动画Android源码实例

大家在玩游戏的时候应该有时候会发现在切换游戏场景的时候 界面会播放一段非常好看的动画 比如一个百叶窗的形式关闭界面 然后在打开界面 效果非常好看 用户体验也非常好,今天我向大家解读游戏开发中常用的四种...

Android 5.0学习之Activity过渡动画

前言 Activity Transition: 提供了三种Transition类型: 进入:一个进入的过渡(动画)决定activity中的所有的视图怎么进入屏幕。 退出...

Android Transition框架(2)-Scene

1 Scenes介绍     scenes 保存了一个包含视图里面的所有Views及属性的状态 2 Scenes创建两种方式    2.1 使用布局文件创建: // Create the sc...

Android Transition 和 Activity & Fragment Transition详解(三)--从创建一个Scene开始

Scenes(场景)对象中封装了一个view hierarchy的状态,包括它的视图以及属性值。Transition框架可以在两个不同的Scene之间执行一个动画---这两个Scene一个被定义为起始...

android过渡动画之makeSceneTransitionAnimation学习笔记

android的过渡动画已经出了好久了,一直没怎么使用。自己还是懒啊,昨天在看blog的时候,看到了亓斌的blog里有相关的介绍。正好,自己也就跟着学一下,写一个例子做为应用。 http://blo...

解决Android studio中方法数超过65536,只需三步!比唱歌还简单!

在Android开发中(Android studio开发,eclipse我们就别玩啦),我们一定会遇到项目越写越大,方法数超过65536的情况。 如果你还在删这删那,以减少方法数的方法来做,那你永远都...

Android出现65535的原因

深度剖析65535问题的产生原因

Scene场景切换与scheduler的使用

场景切换是通过导演类Director实现的,其中的相关函数如下: runWithScene(Scene* scene)。该函数可以运行场景。只能在启动第一个场景时候调用该函数。如果已经有一个场景运行...

android学习(十七) 使用Scene和Transition转换视图

使用Scene和Transition转换视图
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 场景转换Scene配合动画的使用
举报原因:
原因补充:

(最多只允许输入30个字)