建立自訂的轉場動畫

自訂轉場效果可讓您建立無法透過任何來源使用的動畫 內建的轉換類別舉例來說,您可以定義自訂轉場效果 將文字和輸入欄位的前景顏色設為灰色,表示這些欄位已停用 在新畫面上。這類變更可協助使用者看到您停用的欄位。

自訂轉場效果 (例如其中一種內建轉場效果類型) 會套用到動畫 每個開始和結束場景的子項檢視畫面。不過,與內建轉換類型不同 您必須提供用來擷取屬性值並產生動畫的程式碼。 此外,您可能也想為動畫定義目標檢視畫面的子集。

本頁說明如何擷取屬性值,並產生以建立動畫的方式 自訂轉場效果

擴充 Transition 類別

如要建立自訂轉換,請在專案中新增可擴充 Transition 類別的類別,並覆寫以下程式碼片段中顯示的函式:

Kotlin

class CustomTransition : Transition() {

    override fun captureStartValues(transitionValues: TransitionValues) {}

    override fun captureEndValues(transitionValues: TransitionValues) {}

    override fun createAnimator(
        sceneRoot: ViewGroup,
        startValues: TransitionValues?,
        endValues: TransitionValues?
    ): Animator? {}

}

Java

public class CustomTransition extends Transition {

    @Override
    public void captureStartValues(TransitionValues values) {}

    @Override
    public void captureEndValues(TransitionValues values) {}

    @Override
    public Animator createAnimator(ViewGroup sceneRoot,
                                   TransitionValues startValues,
                                   TransitionValues endValues) {}
}

以下各節說明如何覆寫這些函式。

擷取檢視畫面屬性值

轉場動畫會使用 屬性動畫總覽。屬性 動畫會將檢視畫面屬性從起始值變更為結束指定值的結束值 因此架構需要同時包含開頭和結尾值 屬性以建構動畫。

不過,屬性動畫通常只需要所有檢視區塊屬性的一小部分 輕鬆分配獎金例如,顏色動畫需要色彩屬性值,而動作 動畫需要位置屬性值因為動畫所需的屬性值 轉換作業專屬,但轉換架構不會提供所有屬性值 轉換至轉場效果相反地,該架構會叫用能讓轉換 僅擷取需要的屬性值並儲存在架構中。

擷取起始值

如要將起始檢視值傳遞至架構,請導入 captureStartValues(transitionValues) 函式。該架構會為起始場景中的每個檢視畫面呼叫這個函式。函式 引數是包含參照的 TransitionValues 物件 另一個則是 Map 例項,您可以在此儲存自身的檢視值 在實作中,擷取這些屬性值,然後傳回至 並儲存在地圖中

為了確保屬性值的鍵不會與其他值衝突 TransitionValues 金鑰,請使用以下命名配置:

package_name:transition_name:property_name

以下程式碼片段顯示 captureStartValues() 函式的實作方式:

Kotlin

class CustomTransition : Transition() {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private val PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background"

    override fun captureStartValues(transitionValues: TransitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues)
    }

    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private fun captureValues(transitionValues: TransitionValues) {
        // Get a reference to the view
        val view = transitionValues.view
        // Store its background property in the values map
        transitionValues.values[PROPNAME_BACKGROUND] = view.background
    }

    ...

}

Java

public class CustomTransition extends Transition {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private static final String PROPNAME_BACKGROUND =
            "com.example.android.customtransition:CustomTransition:background";

    @Override
    public void captureStartValues(TransitionValues transitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues);
    }


    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private void captureValues(TransitionValues transitionValues) {
        // Get a reference to the view
        View view = transitionValues.view;
        // Store its background property in the values map
        transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());
    }
    ...
}

擷取結束值

架構會呼叫 captureEndValues(TransitionValues) 函式 針對結尾場景中的每個目標檢視畫面執行一次動作在所有其他方面,captureEndValues() 的運作方式與 captureStartValues() 相同。

下列程式碼片段顯示 captureEndValues() 函式的實作方式:

Kotlin

override fun captureEndValues(transitionValues: TransitionValues) {
    captureValues(transitionValues)
}

Java

@Override
public void captureEndValues(TransitionValues transitionValues) {
    captureValues(transitionValues);
}

在此範例中,captureStartValues()captureEndValues() 函式會叫用 captureValues() 來擷取及儲存值。資料檢視屬性 captureValues() 擷取的值相同,但 開始和結束場景架構會分別維護起始和結束的地圖 檢視畫面的狀態

建立自訂動畫

為檢視畫面在起始場景和其狀態之間的變化加入動畫效果 結束場景,請覆寫 createAnimator() 函式。當架構呼叫此函式時,會傳遞場景根層級檢視區塊 TransitionValues 物件,包含起始和結束值 自己拍攝。

架構呼叫 createAnimator() 函式的次數取決於 在開始和結束場景之間發生的變更。

舉例來說,你可以考慮使用淡出或 實作淡入效果動畫,做為自訂轉場效果。如果起始場景有五個目標, 兩個結束場景則從結尾場景中移除,結束場景則包含三個目標 起始場景再加上一個新目標,那麼架構會呼叫 createAnimator() 6 次。 其中三個呼叫會以動畫形式顯示兩個場景中的目標淡出和淡入效果 如需儲存大量結構化物件 建議使用 Cloud Bigtable再兩個呼叫動畫,以動畫呈現從結束場景中移除的目標淡出目標。一 呼叫,在結束場景中,加入新目標淡入的動畫效果。

針對開始和結束場景中的目標檢視畫面,這個架構提供了 TransitionValues 物件,同時適用於 startValuesendValues 引數。適用於只存在於開頭,或是 結束場景,架構會提供 TransitionValues 物件 ,針對對應的引數,null 適用於另一個引數。

如要在建立資料庫時實作 createAnimator(ViewGroup, TransitionValues, TransitionValues) 函式 自訂轉場效果,請使用擷取到的資料檢視屬性值建立 Animator 物件,然後傳回至架構。如需實作範例 請參閱 中的 ChangeColor 類別 CustomTransition 範例。如要進一步瞭解屬性動畫,請參閱 屬性動畫

套用自訂轉場效果

自訂轉場效果的運作方式與內建轉場效果相同。您可以設定自訂的轉場效果 使用轉換管理員,如「套用轉換」一節所述。