Android官方开发文档Training系列课程中文版:动画视图之场景创建

简介: 原文地址:http://android.xsoftlab.net/training/transitions/scenes.html场景存储了View层级的状态,包含所有的View及View的属性。

原文地址: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_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>

从布局中生成场景

在定义了两个场景布局文件之后,则可以开始操作它们了。这可以使开发者在两个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.

目录
相关文章
|
11月前
|
Android开发 开发者
Android利用SVG实现动画效果
本文介绍了如何在Android中利用SVG实现动画效果。首先通过定义`pathData`参数(如M、L、Z等)绘制一个简单的三角形SVG图形,然后借助`objectAnimator`实现动态的线条绘制动画。文章详细讲解了从配置`build.gradle`支持VectorDrawable,到创建动画文件、关联SVG与动画,最后在Activity中启动动画的完整流程。此外,还提供了SVG绘制原理及工具推荐,帮助开发者更好地理解和应用SVG动画技术。
524 30
|
11月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
675 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
11月前
|
API Android开发 开发者
Android颜色渐变动画效果的实现
本文介绍了在Android中实现颜色渐变动画效果的方法,重点讲解了插值器(TypeEvaluator)的使用与自定义。通过Android自带的颜色插值器ArgbEvaluator,可以轻松实现背景色的渐变动画。文章详细分析了ArgbEvaluator的核心代码,并演示了如何利用Color.colorToHSV和Color.HSVToColor方法自定义颜色插值器MyColorEvaluator。最后提供了完整的源码示例,包括ColorGradient视图类和MyColorEvaluator类,帮助开发者更好地理解和应用颜色渐变动画技术。
354 3
|
11月前
|
Android开发 开发者
Android SVG动画详细例子
本文详细讲解了在Android中利用SVG实现动画效果的方法,通过具体例子帮助开发者更好地理解和应用SVG动画。文章首先展示了动画的实现效果,接着回顾了之前的文章链接及常见问题(如属性名大小写错误)。核心内容包括:1) 使用阿里图库获取SVG图形;2) 借助工具将SVG转换为VectorDrawable;3) 为每个路径添加动画绑定属性;4) 创建动画文件并关联SVG;5) 在ImageView中引用动画文件;6) 在Activity中启动动画。文末还提供了完整的代码示例和源码下载链接,方便读者实践操作。
504 65
|
11月前
|
XML Java Maven
Android线条等待动画JMWorkProgress(可添加依赖直接使用)
这是一篇关于Android线条等待动画JMWorkProgress的教程文章,作者计蒙将其代码开源至GitHub,提升可读性。文章介绍了如何通过添加依赖库使用该动画,并详细讲解了XML与Java中的配置方法,包括改变线条颜色、宽度、添加文字等自定义属性。项目已支持直接依赖集成(`implementation &#39;com.github.Yufseven:JMWorkProgress:v1.0&#39;`),开发者可以快速上手实现炫酷的等待动画效果。文末附有GitHub项目地址,欢迎访问并点赞支持!
343 26
|
Android开发
【错误记录】Android Studio 创建报错 ( The length of the module location exceeds the limit of 100 characters. )
【错误记录】Android Studio 创建报错 ( The length of the module location exceeds the limit of 100 characters. )
275 0
【错误记录】Android Studio 创建报错 ( The length of the module location exceeds the limit of 100 characters. )
|
6月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1107 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
870 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1020 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
7月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
795 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡

热门文章

最新文章

下一篇
开通oss服务