Android官方开发文档Training系列课程中文版:动画视图之场景创建
原文地址:http://android.xsoftlab.net/training/transitions/scenes.html
场景存储了View层级的状态,包含所有的View及View的属性。转场框架在启动场景与结束场景之间运行动画。启动场景通常由当前的UI状态自动决定。对于结束场景,转场框架提供了两种实现方式:从布局资源文件中创建场景或从代码中创建场景。
这节课主要学习如何创建场景及如何定义场景行为。下节课则主要学习如何在两个场景之间转换。
Note: 转场框架可以不使用场景来使动画作用单个View层级,就像Apply a Transition Without Scenes中描述的。无论如何,了解这节课有助于懂得转换的基本工作原理。
由布局资源创建场景
开发者可以直接从布局资源文件中创建场景实例。当View层级几乎是静止状态时可以使用这项技术。创建好的场景代表了View层级的状态。一旦View层级发生变化,则需要重新床架场景。转场框架会由资源文件中的整个View层级创建场景,因此不能由资源文件的部分层级创建场景。
为了可以从布局资源文件中创建场景,则需要从布局中接收场景容器,一般是一个ViewGroup实例,然后再调用Scene.getSceneForLayout()方法,这个方法需要传入场景容器以及包含场景布局资源文件的ID。
为场景定义布局
下面的代码段展示了如何为一个场景容器元素创建两个不同的场景。代码段还展示了开发者可以加载多个不相关的场景,不过这并不意味着每个场景之间不无关系。
示例结构由以下布局定义构成:
- 主布局包含一个文本控件和一个容器控件。
- 第一个场景的相关布局包含两个文本控件。
- 第二个场景的相关布局同样包含两个文本控件,但是两个控件的顺序是颠倒的。
示例被设计为在Activity的主布局的子布局之间进行动画。主布局的文本控件则会保持静止。
Activity的主布局定义如下:
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>
这个布局定义包含了一个文本控件及场景容器的子布局控件。第一个场景的布局被包含在主布局之内。这意味着第一个场景布局会被作为初始化UI的一部分,还可以被加载到一个场景中,因为转场框架只能加载一整个布局文件。
第一个场景的布局文件如下:
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_view1android:text="Text Line 1" /><TextView
android:id="@+id/text_view2android: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_view2android:text="Text Line 2" /><TextView
android:id="@+id/text_view1android:text="Text Line 1" />
</RelativeLayout>
从布局中生成场景
在定义了两个场景布局文件之后,则可以开始操作它们了。这可以使开发者在两个UI配置之间延迟转场。为了可以操作一个场景,则需要先获得场景容器的引用及布局资源的ID。
下面的代码段展示了如何获得场景容器的引用及从布局文件中创建两个Scene对象:
Scene mAScene;
Scene mAnotherScene;
// Create the scene root for the scenes in this app
mSceneRoot = (ViewGroup) findViewById(R.id.scene_root);
// Create the scenes
mAScene = Scene.getSceneForLayout(mSceneRoot, R.layout.a_scene, this);
mAnotherScene =Scene.getSceneForLayout(mSceneRoot, R.layout.another_scene, this);
现在在应用中有了两个Scene对象。每个Scene都会使用到场景容器。
在代码中创建场景
开发者还可以在代码中创建Scene对象。当开发者需要直接修改View层级或者动态生成View层级就可以使用这项技术。
为了可以在代码中创建场景。需要使用Scene(sceneRoot, viewHierarchy)构造方法。调用这个构造方法等同于调用Scene.getSceneForLayout()方法。只是该构造方法需要预先加载布局文件。
下面的代码段演示了如何在代码中由场景容器元素及场景的View层级创建一个Scene实例:
Scene mScene;
// Obtain the scene root element
mSceneRoot = (ViewGroup) mSomeLayoutElement;
// Obtain the view hierarchy to add as a child of
// the scene root when this scene is entered
mViewHierarchy = (ViewGroup) someOtherLayoutElement;
// Create a scene
mScene = new Scene(mSceneRoot, mViewHierarchy);
创建场景行为
转场框架还可以使开发者定义转场开始或者结束的行为。在很多情况下,自定义转场行为并不是必须的,因为转场框架会在场景之间自动改变动画。
转场行为有助于处理以下情况:
- 作用动画的View处于不同的层级。开发者可以在场景启动及结束的时候使用退出或者进入场景的行为。
- 转场框架不能够自动的作用View的动画,比如ListView,更多相关信息,请参见Limitations.
如果要定义自定义行为,需要将行为作为Runnable对象传入到Scene.setExitAction()方法或Scene.setEnterAction()方法。转场框架会在运行转场动画之前调用Scene.setExitAction()方法,会在转场动画结束之后调用Scene.setEnterAction()方法。
Note: 不要使用场景行为在启动场景与结束场景的View之间传递数据。更多相关信息,请参见Defining Transition Lifecycle Callbacks.
Android官方开发文档Training系列课程中文版:动画视图之场景创建相关推荐
- Android官方开发文档Training系列课程中文版:通知用户之创建不同导航方式的Activity
原文地址:http://android.xsoftlab.net/training/notify-user/navigation.html 设计通知时要考虑到用户所预想的导航体验.通常有以下两种情况: ...
- Android官方开发文档Training系列课程中文版:目录
原文地址 : http://android.xsoftlab.net/training/index.html 引言 在翻译了一篇安卓的官方文档之后,我觉得应该做一件事情,就是把安卓的整篇训练课程全部翻 ...
- Android官方开发文档Training系列课程中文版:创建自定义View之View的创建
原文地址:http://android.xsoftlab.net/training/custom-views/index.html 引言 Android框架含有大量的View类,这些类用来显示各式各样 ...
- Android官方开发文档Training系列课程中文版:OpenGL绘图之图形绘制
原文地址:http://android.xsoftlab.net/training/graphics/opengl/draw.html 如果你还不清楚如何定义图形及坐标系统,请移步:Android官方 ...
- Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之Fragment创建
原文地址:http://android.xsoftlab.net/training/basics/fragments/index.html 导言 为了在Android中创建动态的多面板用户界面,你需要 ...
- Android官方开发文档Training系列课程中文版:打印内容之HTML文档打印
原文地址:http://android.xsoftlab.net/training/printing/html-docs.html 在Android中打印内容要比打印照片要复杂一些,它要求将文本与图像 ...
- Android官方开发文档Training系列课程中文版:动画视图之应用场景
原文链接:http://android.xsoftlab.net/training/transitions/transitions.html 在转场框架中,动画是由一帧帧的图像连续绘制形成的,这一帧帧 ...
- Android官方开发文档Training系列课程中文版:动画视图之转场框架介绍
原文地址:http://android.xsoftlab.net/training/transitions/index.html 引言 Activity所呈现的UI经常会由用户的输入或者其它事件而发生 ...
- Android官方开发文档Training系列课程中文版:动画视图之创建自定义转场动画
原文地址:http://android.xsoftlab.net/training/transitions/custom-transitions.html 自定义转场可以创建自定义动画.比如,可以定义 ...
最新文章
- springboot 没有跳转到指定页面
- python Flask框架如何请求及返回数据——flask详细教程
- CSP认证201703-4	地铁修建[C++题解]:连通路径上的最大边权最小、bfs求边权为1的最短路、二分查找
- 【C/C++】运算结果出现1.#Q0问题分析
- 汽车之家10周年办演唱会,厂商们怎么看?
- Java基础之String深入解析
- iframe父子页面间的关系
- 树形结构 —— 树与二叉树
- 客户端的效果 ktv 1216
- Java实现一个字符串的反转
- 单播广播多播任播的分别
- 抽象工厂模式java_Java描述设计模式(04):抽象工厂模式
- SQL Server分组查询
- 物联网LoRa系列-25:LoRa终端--LoRaWAN协议简介与LoRa WAN终端软件选择
- 程序员【超实用】面试问题
- 静态分析软件(QAC、Klocwork,Coverity等),单元测试软件集成测试软件 (VectorCAST、testbed、tessy、c++test等)下载安装使用试用
- 计算机二级软件excel打不开怎么办,excel文件打不开的9种情况和解决办法
- 网页 flash swf 无法调用 摄像头 问题解决
- java适合音频格式_我应该为java使用什么音频格式?
- python控制画笔尺寸_Python turtle库的画笔控制说明
热门文章
- UNIX TCP回射服务器/客户端之使用epoll模型的服务器
- 看完少年的你,想到少年的我
- Android init.rc 服务启动不成功
- 每日一题(24)—— const
- python价值观测试程序例子_PyBrains学习迷宫的例子。国家价值观与全球政策
- dedecms怎么改php版本_PHP程序员进阶之路
- 手机调试python的软件_Appium+Python(ios真机移动端App H5混合自动化实战测试)
- 设计模式_2_单例模式
- 图像分类_04神经网络最优化过程:反向传播+代码实现
- 一、AJAX学习笔记——原生AJAX (ajax简介、XML简介、ajax优缺点、ajax的使用)