カスタムの遷移アニメーションを作成する

カスタム遷移を使用すると、 組み込みの遷移クラスを見てみましょうたとえば、カスタム遷移を定義することもできます。 テキストと入力フィールドの前景色がグレーになり、フィールドが無効になっていることを示します クリックします。この種の変更は、フィールドが無効であることをユーザーに示すのに役立ちます。

カスタム遷移は、組み込みの遷移タイプと同様に、アニメーションを 開始シーンと終了シーンの両方の子ビューを作成します。ただし 組み込みの遷移タイプとは異なり プロパティ値を取得してアニメーションを生成するコードを用意する必要があります。 アニメーションのターゲット ビューのサブセットを定義することもできます。

このページでは、プロパティ値を取得し、アニメーションを生成して、 使用できます。

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) {}
}

次のセクションでは、このような関数をオーバーライドする方法について説明します。

ビューのプロパティ値の取得

遷移アニメーションは、以下で説明するプロパティ アニメーション システムを使用します。 プロパティ アニメーションの概要プロパティ アニメーションでは、指定された期間のビュー プロパティを開始値から終了値に変更できます。 そのためフレームワークでは、開始値と終了値の両方を プロパティを使用してアニメーションを作成します。

ただし、通常、プロパティ アニメーションに必要なのは、すべてのビューのプロパティのうちの小さなサブセットのみです。 使用できます。たとえば、カラー アニメーションにはカラー プロパティ値が必要ですが、動きにはカラー プロパティの値が必要です。 アニメーションには position プロパティ値が必要です。アニメーションに必要なプロパティ値は は、Transitions に固有であるため、Transitions フレームワークでは、すべてのプロパティ値が提供されるわけではありません。 できます。代わりに、フレームワークはコールバック関数を呼び出し、 必要なプロパティ値のみを取得し、フレームワークに格納します。

開始値の取得

開始ビューの値をフレームワークに渡すには、 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) 関数を呼び出す ターゲット ビューごとに 1 回ずつ返されます。その他に関しては 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() 関数を呼び出す回数は、 生じる変化を表します。

たとえば、フェードアウトや カスタム遷移として実装されるフェードイン アニメーション。開始シーンに 5 つのターゲットがある場合、 エンディングのシーンから 2 つが削除され、終了シーンの 3 つのターゲットが 開始シーンと新しいターゲットを追加すると、フレームワークは createAnimator() を 6 回呼び出します。 3 つの呼び出しで、両方のシーンに残るターゲットのフェードアウトとフェードインをアニメーション化します。 説明します。さらに 2 つの呼び出しを行うと、終了シーンから削除されたターゲットのフェードアウトがアニメーション化されます。1 本 call は、終了シーンで新しいターゲットのフェードインをアニメーション化します。

開始シーンと終了シーンの両方に存在するターゲット ビューの場合、フレームワークでは TransitionValues オブジェクト(startValuesendValues 引数。開始ビューまたは 終了シーンでは、フレームワークは TransitionValues オブジェクトを提供します。 には対応する引数、null にはもう 1 つの引数を指定します。

作成時に createAnimator(ViewGroup, TransitionValues, TransitionValues) 関数を実装するには、 カスタム遷移の場合は、取得したビュー プロパティ値を使用して Animator オブジェクトを作成し、フレームワークに返します。実装例を見てみましょう ChangeColor クラスをご覧ください。 CustomTransition のサンプル。プロパティ アニメーターについて詳しくは、このモジュールの プロパティ アニメーション

カスタム遷移の適用

カスタム遷移は、組み込み遷移と同様に機能します。カスタム遷移効果を 移行を適用するで説明されているように、移行マネージャーを使用する。