Android 4.4 Transition Framework ,更加動態的更新xml,和動畫

英文原版地址,點這裏
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 青鸞之旅

相關文章
相關標籤/搜索