英文原版地址,點這裏
java
第一種使用方式。。可能習慣原來ViewGroup的 比較熟悉點。。這樣其實也不容易出錯。。。android
RelativeLayout sceneBase = (RelativeLayout)findViewById(R.id.scene_base); //Create a new layout for the second scene ViewGroup scene2Group = (ViewGroup)getLayoutInflater().inflate(R.layout.scene_2, sceneBase, false); //Create a scene using the root element from the initial scene //plus the new group we just created final Scene scene2 = new Scene(sceneBase, scene2Group); //When the user clicks the button transition from scene1 to scene2 Button button = (Button)sceneBase.findViewById(R.id.press_me); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TransitionManager.go(scene2); } });
android 4.4 提供了一個新的,更簡便地向ViewGroup塞東西的方式app
container = (ViewGroup)findViewById(R.id.scene_base); current = Scene.getSceneForLayout(container, R.layout.scene1, this); another = Scene.getSceneForLayout(container, R.layout.scene2, this); current.enter(); bt2 =(Button)findViewById(R.id.press_me); bt2.setOnClickListener(new OnClickListener(){ public void onClick(View view){ Scene tem = current; current = another; another = tem; TransitionManager.go(current); } });
注意這個過程是不可逆的!!!!,除非你把改變他們的觸發方式寫到外面,也就是說這裏的Button按鈕也會改變的話,就沒法再變回來了。。。由於它用的是 inflater 裏面的用新的xml文件替換掉原來的父佈局李敏啊的組件。。。。框架
下面是完整的代碼ide
首先建立一個 名爲scene1.xml的佈局文件函數
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scene_base" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/welcome_text" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="This is the first scene!" android:layout_centerHorizontal="true"/> <Button android:id="@+id/press_me" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_below="@id/welcome_text" android:text="Press me!" android:gravity="center_horizontal" android:layout_centerHorizontal="true"/> </RelativeLayout>
再建立一個名爲 scene2.xml的文件,沒錯這個就是替換後的佈局文件佈局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scene_base" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/welcome_text" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="This is the second scene" android:layout_centerHorizontal="true" /> <TextView android:id="@+id/second_line" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="It contains 2 views with the same IDs as scene_1" android:layout_below="@id/welcome_text" android:layout_centerHorizontal="true" /> <TextView android:id="@+id/third_line" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="But it also contains two new lines of text" android:layout_below="@id/second_line" android:layout_centerHorizontal="true" /> <Button android:id="@+id/press_me" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="I'm done" android:gravity="center_horizontal" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" /> </RelativeLayout>
最後是邏輯的部分。有兩個版本。。我都附上測試
版本一,也是新的SDK中推薦的。。。但我我的以爲這樣雖然簡單了。。。但細節上不可控ui
package com.qingluan.testsome; import android.os.Build; import android.os.Bundle; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import android.transition.Scene; import android.transition.Transition; import android.transition.TransitionInflater; import android.transition.TransitionManager; public class MainActivity extends Activity { private ViewGroup container; private TextView thisis; private Button bt2; private Scene current; private Scene another; private Transition mytransition; private Integer count; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.scene1); // 注意這裏不是用的默認佈局文件而是咱們寫的第一個文件 count = 0; Kitkat(); bt2 =(Button)findViewById(R.id.press_me); bt2.setOnClickListener(new OnClickListener(){ public void onClick(View view){ Scene tem = current; current = another; another = tem; TransitionManager.go(current); } }); } @TargetApi(19) public void Kitkat (){ container = (ViewGroup)findViewById(R.id.scene_base); current = Scene.getSceneForLayout(container, R.layout.scene1, this); another = Scene.getSceneForLayout(container, R.layout.scene2, this); current.enter(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
第二個版本 ,用的是咱們熟悉的 Inflater.inflate(int,root ,boolean) 工廠模式模式 this
package com.qingluan.testsome; import android.os.Build; import android.os.Bundle; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import android.transition.Scene; import android.transition.Transition; import android.transition.TransitionInflater; import android.transition.TransitionManager; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Set the layout to the initial scene setContentView(R.layout.scene1);//這裏不是默認xml //這裏將須要更改的父佈局的框架先聲明出來,等會須要改變如今的這個佈局裏面的東西 RelativeLayout sceneBase = (RelativeLayout)findViewById(R.id.scene_base); //而後在這裏把改變後的佈局文件塞入咱們的工廠中,特別注意的是‘inflate’ 的第三個變量必須是false,不然會馬上把裏面的東西馬上塞入佈局中,最後的結果是,還沒等咱們選擇轉換,就已經轉換了,而這裏的第一個參數就是改變後的佈局,它會唄組裝進入第二參數裏面。。 ViewGroup scene2Group = (ViewGroup)getLayoutInflater().inflate(R.layout.scene2, sceneBase, false); 建立要轉換的第二個屏幕(暫時這樣翻譯)其中第一個參數將變爲第二個參數的父佈局。 final Scene scene2 = new Scene(sceneBase, scene2Group); //When the user clicks the button transition from scene1 to scene2 Button button = (Button)sceneBase.findViewById(R.id.press_me); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TransitionManager.go(scene2); //這個就是最重要的轉換函數。。。而第二個參數是隱藏的,那個參數是爲了本身定製本身的轉換特效而設置的,這裏就暫時不敘述了 } }); }
有不對的地方但願指出。。。最後要當心。。這樣轉換有一個不方便的地方,就是,若是你使用了原來諸如 TextView.setText()之類的函數的話,只要轉換就會初始化爲XML文件中的內容。。,甚至你的setText直接失效,至於解決辦法目前我還沒測試出來,有會的朋友但願儘快聯繫我 最後 謝!
———— by 青鸞之旅