Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android官方開發文檔Training系列課程中文版:動畫視圖之應用場景

Android官方開發文檔Training系列課程中文版:動畫視圖之應用場景

編輯:關於Android編程

原文鏈接:http://android.xsoftlab.net/training/transitions/transitions.html

在轉場框架中,動畫是由一幀幀的圖像連續繪制形成的,這一幀幀的圖像描述了啟動場景到結束場景的整個過程。轉場框架將這些動畫作為一個轉場對象,這個對象包含了動畫的相關信息。如果要運行動畫,需要提供一個轉場對象,及結束場景對象給轉場管理者。

這節課將會學習如何在場景轉換中使用平移、縮放及淡入淡出動畫。下節課將會學習如何定義自定義動畫。

創建轉場

在前面的課程中,我們學習了如何創建場景動畫的相關知識。在定義了啟動場景結束場景之後,還需要創建一個Transition對象。轉場框架允許使用內置的轉場對象或動態創建的轉場對象。

由資源文件創建轉場對象

這項技術的優點是,不用修改Java代碼就可以實現轉場定義的修改。這項技術還可以將復雜形式的轉場定義代碼分離成簡單的形式,更多的信息請參見Specify Multiple Transitions。

如果要使用內置的轉場資源,主要執行以下步驟:

1.在工程中添加目錄res/transition/。

2.在上面的目錄中創建一個新的XML資源文件。

3.添加一個內置的轉場節點到該文件中。

下面的示例代碼使用了Fade轉場動畫:
res/transition/fade_transition.xml

下面的代碼段展示了如何加載轉場資源:

Transition mFadeTransition =
        TransitionInflater.from(this).
        inflateTransition(R.transition.fade_transition);

動態創建轉場對象

這項技術可以在代碼中動態的創建轉場對象,使得可以在代碼中修改UI界面。創建簡單的內置轉場實例只需要少量的參數。

如果要創建內置的轉場實例,需要調用類Transition子類其中的一個構造方法即可。下面的示例創建了一個Fade轉場的實例:

Transition mFadeTransition = new Fade();

使用轉場動畫

通常需要使用轉場動畫來響應某些事件,比如用戶的輸入行為。考慮有這麼一種情景,當用戶輸入了要搜索的關鍵詞,按下了搜索按鈕,接下來APP會變換場景,變換後的場景顯示了搜索之後的結果,並且原來場景的輸入框與搜索按鈕會被隱藏。

為了使動畫可以響應用戶的某些輸入,需要調用靜態方法 TransitionManager.go(),並需要傳入結束場景及轉場動畫:

TransitionManager.go(mEndingScene, mFadeTransition);

轉場動畫由轉場實例所指定的結束場景開始,這裡的啟動場景是上一個轉場動畫的結束場景。如果沒有上一個轉場,那麼啟動場景會根據當前的UI狀態自動決斷。

如果沒有指定轉場實例,那麼轉場管理者會采用一種自動轉場的動畫。有關更多信息,請參見TransitionManager類。

選擇指定的目標View

默認情況下,轉場框架可以對所有的View執行轉場。不過在某些情況下,可能需要將轉場動畫作用在View的子集上。比如,轉場框架並不支持在ListView對象上使用動畫,所以不要試圖在ListView上使用動畫。不過轉場框架允許選擇指定的View來使用動畫。

每一個可以作用轉場動畫的View都被稱為target.不過只可以選擇其中一個與場景相關的部分.

如果要從target列表中要移除View,需要在啟動轉場之前調用removeTarget()方法。如果要往target列表中添加View,調用addTarget()方法即可。有關更多信息,請參見Transition類。

多重轉場

為了能使動畫引起更多的關注,應該使動畫的類型與所發生的事件相匹配。比如說,在移除某些View的時候,使用淡出效果會在潛意識中告訴用戶這個View不再可用。再比如,在屏幕上移動View,最好的方式就是使用動畫可以描述整個移動過程,以便讓用戶注意到View移動到了新的位置上。

你大可不必糾結選哪一種動畫才好,轉場框架提供了一種整合動畫的能力,它可以將內置動畫或者自定義動畫整合到一起一同執行。

如果要在XML中定義轉場集合,需要在res/transitions/目錄下創建一個資源文件,然後在文件中列出各個轉場動畫。下面的代碼段定義了與AutoTransition類相同特性的定義:


    
    
    

如要加載上述的轉場集合,需要調用TransitionInflater.from()方法。由於TransitionSet繼承了Transition,所以可以像普通的Transition對象一樣使用Transition對象集合。

在非場景中使用轉場動畫

更改View層級並不是修改UI界面的唯一方式。除此之外,還可以在單一層級中通過添加,修改,移除的方式更改用戶界面。比如說,可以通過單一的布局來實現搜索界面。這個布局剛開始只顯示了一個搜索的輸入框與一個搜索圖標。如果要顯示搜索結果,需要在用戶點擊搜索按鈕的時候通過調用ViewGroup.removeView()方法移除搜索按鈕,然後通過ViewGroup.addView()方法添加搜索結果。

你可能在與上述情況相似的情況下采用過類似的解決方式。比起采用兩個單獨的布局文件而言,采用動態修改單個布局文件的方式也可以完成相同的效果。

如果要實現上面的情景,那麼則不需要創建場景。相反,你可以使用延遲轉場動畫實現這種情況。轉場框架的這個特性由當前View層級的狀態開始,記錄了該View層級的變化狀態,最終在系統重繪UI時將轉場應用到這個過程。

如果要使用單一的View層級創建延遲轉場,需要執行以下步驟:

1.如果要觸發轉場事件的發生,則需要調用TransitionManager.beginDelayedTransition()方法,該方法暴露了兩個參數:1.執行更改View的父View,2.要使用的轉場動畫。轉場框架會存儲更改View的當前狀態及屬性值。

2.要更改的View一定是跟使用情況相關的。轉場框架會記錄更改View的改變過程及屬性。

3.在系統重繪用戶界面的過程中,轉場框架會在這個過程中執行動畫。

下面的示例展示了如何使用延遲轉場動畫添加TextView。第一段定義了布局文件:
res/layout/activity_main.xml


    
    ...

第二段定義了動畫添加TextView的代碼:

private TextView mLabelText;
private Fade mFade;
private ViewGroup mRootView;
...
// Load the layout
this.setContentView(R.layout.activity_main);
...
// Create a new TextView and set some View properties
mLabelText = new TextView();
mLabelText.setText("Label").setId("1");
// Get the root view and create a transition
mRootView = (ViewGroup) findViewById(R.id.mainLayout);
mFade = new Fade(IN);
// Start recording changes to the view hierarchy
TransitionManager.beginDelayedTransition(mRootView, mFade);
// Add the new TextView to the view hierarchy
mRootView.addView(mLabelText);
// When the system redraws the screen to show this update,
// the framework will animate the addition as a fade in

定義轉場的生命周期回調

轉場的生命周期與Activity的生命周期非常類似。它代表了由TransitionManager.go()方法開始到動畫執行結束之間的完整的時間過程。在重要的生命過程中,轉場框架會調用TransitionListener接口所定義的回調。

這些回調是極有用的,比如說,在場景轉變的過程中復制View的屬性值。你不能簡單的將開始時View的值拷貝到結束時的View上,因為在轉場完成之前結束中的View層級還沒有完全被填充。相反的,你可以將值拷貝到一個變量中,然後在轉場框架結束的時候將值拷貝到View層級中。為了可以在轉場完成的時候獲得通知,可以在Activity中實現TransitionListener.onTransitionEnd()方法。

有關更多信息,請參見TransitionListener類的相關說明。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved