Navigation コンポーネントを使用すると、プロパティ アニメーションとビュー アニメーションの両方をアクションに追加できます。独自のアニメーションを作成する方法については、アニメーション リソースをご覧ください。
Navigation コンポーネントには、すぐに利用できるデフォルト アニメーションもいくつか用意されています。アクションにアニメーションを追加する手順は次のとおりです。
- Navigation Editor 内で、アニメーションを実行するアクションをクリックします。
- [Attributes] パネルの [Animations] で、追加するアニメーションの横にあるプルダウン矢印をクリックします。以下のタイプの中から選択できます。
- デスティネーションに入る
- デスティネーションを出る
- ポップ アクション経由でデスティネーションに入る(ポップ アクションとは、ナビゲーション時にバックスタックから別のデスティネーションをポップオフするアクションです)
- ポップ アクション経由でデスティネーションを出る
- 表示されたプロジェクト アニメーションのリストから、アニメーションを選択します。
アニメーションを追加したら、[Text] タブをクリックして、XML テキストビューに切り替えます。アニメーションの XML が、対応する <action>
要素内に表示されます。以下の例で、specifyAmountFragment
は、confirmationAction
アクションのソース デスティネーションを示しています。
<fragment android:id="@+id/specifyAmountFragment" android:name="com.example.buybuddy.buybuddy.SpecifyAmountFragment" android:label="fragment_specify_amount" tools:layout="@layout/fragment_specify_amount"> <action android:id="@+id/confirmationAction" app:destination="@id/confirmationFragment" app:enterAnim="@anim/slide_in_right" app:exitAnim="@anim/slide_out_left" app:popEnterAnim="@anim/slide_in_left" app:popExitAnim="@anim/slide_out_right" /> </fragment>
デスティネーション間に共有要素遷移を追加する
2 つのデスティネーション間でビューを共有する場合、共有要素遷移を使用して、デスティネーション間を移動する際のビューの遷移方法を定義できます。共有要素遷移は、遷移フレームワークに含まれています。
共有要素は、ナビゲーション XML ファイルではなく、プログラムで指定します。アクティビティとフラグメントのデスティネーションにはそれぞれ、Navigator.Extras
インターフェースのサブクラスがあり、共有要素などのナビゲーションの詳細な設定が可能です。navigate()
を呼び出すときに、これらの Extras
を渡すことができます。
共有要素のフラグメント デスティネーションへの遷移
FragmentNavigator.Extras
クラスを使用すると、FragmentTransaction.addSharedElement()
を使用する場合と同様に、あるデスティネーションから次のデスティネーションへと、共有要素を遷移名でマッピングできます。次の例に示すように、Extras を navigate()
に渡します。
Kotlin
val extras = FragmentNavigatorExtras(view1 to "hero_image") view.findNavController().navigate( R.id.confirmationAction, null, // Bundle of args null, // NavOptions extras)
Java
FragmentNavigator.Extras extras = new FragmentNavigator.Extras.Builder() .addSharedElement(view1, "hero_image") .build(); Navigation.findNavController(view).navigate( R.id.details, null, // Bundle of args null, // NavOptions extras);
共有要素のアクティビティ デスティネーションへの遷移
アクティビティは、ActivityOptionsCompat
を利用して共有要素遷移を制御します(以下の例を参照)。詳細については、共有要素を使ってアクティビティを開始するをご覧ください。
Kotlin
// Rename the Pair class from the Android framework to avoid a name clash import android.util.Pair as UtilPair ... val options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, UtilPair.create(view1, "hero_image")) val extras = ActivityNavigatorExtras(options) view.findNavController().navigate( R.id.details, null, // Bundle of args null, // NavOptions extras)
Java
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, Pair.create(view1, "hero_image")); ActivityNavigatorExtras extras = new ActivityNavigatorExtras.Builder() .setActivityOptions(options) .build(); Navigation.findNavController(view).navigate( R.id.details, null, // Bundle of args null, // NavOptions extras);
アクティビティ遷移に対してポップ アニメーションを適用する
Activity
を出発点または宛先とするナビゲーションを行う際に、ポップ アニメーションが自動的に適用されることはありません。アニメーションを適用するには、アニメーションを発生させるターゲット Activity
デスティネーションから ActivityNavigator.applyPopAnimationsToPendingTransition()
を呼び出す必要があります。
Kotlin
override fun finish() { super.finish() ActivityNavigator.applyPopAnimationsToPendingTransition(this) }
Java
@Override public void finish() { super.finish(); ActivityNavigator.applyPopAnimationsToPendingTransition(this); }