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官方开发文档Trainin
- 下一篇: tensorflow--模型的保存和提取