予測型「戻る」アニメーション

1. 始める前に

この Codelab では、予測型「戻る」アニメーションを SociaLite アプリに追加する方法について説明します。ホームに戻るアニメーションとデフォルト アプリ内アニメーションを追加し、カスタム アプリ内アニメーションを作成します。最後に、予測型「戻る」アニメーションをアプリに追加する際のヒントも紹介します。

前提条件

この Codelab で学ぶこと

  • 以下の予測型「戻る」アニメーションを追加する方法
  • ホームに戻る
  • デフォルト アプリ内アニメーション
  • カスタム アプリ内アニメーション

必要なもの

  • Android Studio の最新バージョン
  • Android 15 ベータ版 2 以降を搭載したテスト用デバイスまたはエミュレータ
  • テスト用のデバイスまたはエミュレータでジェスチャー ナビゲーションが有効になっていること

2. スターター コードを取得する

  1. Codelab アプリをエッジ ツー エッジ対応にするを完了している場合は、すでにスターター コードを取得しています。この手順をスキップし、予測型「戻る」アニメーションを追加するに進んでください。
  2. GitHub からスターター コードをダウンロードするか、リポジトリのクローンを作成して codelab_improve_android_experience_2024 ブランチをチェックアウトします。
$ git clone git@github.com:android/socialite.git
$ cd socialite
$ git checkout codelab_improve_android_experience_2024
  1. Android Studio で SociaLite を開き、Android 15 を搭載したデバイスまたはエミュレータでアプリを実行します。次のような画面が表示されます。

SocialLite アプリの [Chats] 画面。

この Codelab は、別の Codelab アプリをエッジ ツー エッジ対応にするの後に実施することを想定しています。上記の Codelab をまだ完了していない場合は、先に進む前に少なくとも MainActivity.kt ファイルでエッジ ツー エッジが有効になっていることを確認してください。予測型「戻る」アプリ内アニメーションの表示を最適化するには、アプリをエッジ ツー エッジ対応にしておく必要があります。

エッジ ツー エッジが有効になっていない場合は、MainActivity.kt ファイル内でコンテンツを設定する前に enableEdgetoEdge() を追加してください。この行を追加することで、この Codelab を最後まで進められるようになります。ただし、チャット スレッドの下部の UI がシステム ナビゲーション バーによって遮られる場合があります。下部の UI が遮られないようにするには、Codelab アプリをエッジ ツー エッジ対応にするを参照してください。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
   // Ensure to add this line if you haven't already completed the
   // Make your app edge-to-edge codelab.
        enableEdgeToEdge()
        super.onCreate(savedInstanceState)
        setContent {... }
    }
}

アプリをエッジ ツー エッジ対応にすると、SociaLite は次のようになります。

SociaLite アプリのジェスチャー ナビゲーション。

3. ホームに戻る予測型「戻る」アニメーションを追加する

予測型「戻る」とは

予測型「戻る」は、「戻る」ジェスチャーを完了する前に結果をプレビューできるようにするジェスチャー ナビゲーション機能です。ユーザーは結果をプレビューしてから、前のビューに戻るか、現在のビューに留まるかを判断できます。

Android アプリで予測型「戻る」をサポートすることで、ユーザーが安心して操作できるようになり、より優れたアプリ体験を提供できます。

SocialLite アプリのホームに戻る予測型「戻る」

予測型「戻る」のサポートを追加する方法

ホームに戻るアニメーションの予測型「戻る」のサポートを追加していない SociaLite の動作は、次の手順で確認できます。

  1. [Chats] ページにいることを確認します。
  2. システム ホームに戻るためにスワイプすると、すぐにホーム画面に移動します。戻るスワイプのプレビューは表示されません。

ホームに戻るアニメーションのない SocialLite アプリ。

ホームに戻る予測型「戻る」アニメーションのサポートを追加するには、AndroidManifest.xml ファイルで android:enableOnBackInvokedCallback フラグを true に設定します。

// AndroidManifest.xml

<application
  android:name=".SocialApp"
  ...
  android:enableOnBackInvokedCallback="true">
  <activity
    android:name=".MainActivity"
    android:exported="true"
    ...>

上記のようにコードを 1 行変更したことが、SociaLite の戻るスワイプ ジェスチャーにどう影響するかについては次の手順で確認できます。

  1. [Chats] ページにいることを確認します。
  2. システム ホームに戻るため、ゆっくりスワイプします。

[Chats] ページの背後に、戻り先のプレビューが表示されます。これが、ホームに戻る予測型「戻る」アニメーションの動作です。

SocialLite アプリのホームに戻る予測型「戻る」

4. アプリ内アニメーションを追加する

デフォルト アプリ内アニメーション

アプリ内アニメーションの予測型「戻る」のサポートを追加していない SociaLite の動作は、次の手順で確認できます。

  1. [Chats] ページにいることを確認します。
  2. いずれかの会話(たとえば [Sheep])を選択します。
  3. [Chats] ページに戻るため、ゆっくりスワイプします。

クロスフェード アニメーションが表示され、「戻る」ジェスチャーのスワイプを完了すると [Chats] ページに戻ります。

bb2701e3347841d0.gif

SociaLite の他の部分にも予測型「戻る」のサポートを追加する場合は、次の手順を行います。

libs.versions.toml ファイルで、Navigation Compose の依存関係を androidx.navigation:navigation-compose:2.8.0-alpha07 以降にアップグレードします。

// libs.versions.toml

[versions]
...
media3 = "1.2.0"
navigation = "2.8.0-alpha07"
...
  1. 7c2b0d0d8c0fb2c5.png [Sync project with Gradle files] を押します。
  2. SociaLite を再実行します。
  3. [Chats] ページにいることを確認します。
  4. いずれかの会話(たとえば [Sheep])を選択します。
  5. [Chats] ページに戻るため、ゆっくりスワイプします。スワイプに合わせて、[Chats] ページがビューにフェードインします。これはデフォルト アプリ内アニメーションです。

予測型「戻る」デフォルト アプリ内アニメーションを追加した SociaLite アプリ。

カスタム アプリ内アニメーション

予測型「戻る」カスタム アプリ内アニメーションを追加する手順は次のとおりです。

  1. ui/Main.kt ファイル内で NavHost を探します。
  2. popEnterTransitionpopExitTransition を追加します。これらは、フェードインする画面とフェードアウトする画面のサイズ調整に使用します。
// Main.kt
NavHost(
  navController = navController,
  startDestination = "home",
  popEnterTransition = {
    scaleIn(
      animationSpec = tween(
        durationMillis = 100,
        delayMillis = 35,
      ),
      initialScale = 1.1F,
     ) + fadeIn(
         animationSpec = tween(
           durationMillis = 100,
           delayMillis = 35,
         ),
     )
   },
  popExitTransition = {
     scaleOut(
       targetScale = 0.9F,
     ) + fadeOut(
         animationSpec = tween(
           durationMillis = 35,
           easing = CubicBezierEasing(0.1f, 0.1f, 0f, 1f),
         ),
     )
   },
  modifier = modifier,
)
  1. SociaLite を再実行します。
  2. [Chats] ページにいることを確認します。
  3. いずれかの会話(たとえば [Sheep])を選択します。
  4. [Chats] ページに戻るため、ゆっくりスワイプします。スワイプに合わせて、[Sheep] チャット画面が縮小されてフェードアウトし、[Chats] ページが拡大されてビューにフェードインします。

予測型「戻る」カスタム アプリ内アニメーションを追加した SociaLite アプリ。

Accompanist Navigation Animation ライブラリから AndroidX ライブラリへの移行により、Navigation Compose ライブラリによるアニメーションの実行が可能になりました。Navigation Compose ライブラリと組み込みの予測型「戻る」のサポートを使用することで、予測型「戻る」ジェスチャーのサポートを簡単に追加して Android アプリのエクスペリエンスを改善できます。

5. オプション: 予測型「戻る」に関わるその他の考慮事項

このセクションで紹介するヒントは、それぞれのアプリに関連するかどうかに応じて適宜参考にしてください。

ルート(たとえば MainActivity.kt)で「戻る」をインターセプトしない

アプリのルート アクティビティ(たとえば MainActivity.kt)で BackHandler, PredictiveBackHandler, OnBackPressedCallback または OnBackInvokedCallback により「戻る」イベントをインターセプトしている場合、予測型のホームに戻るアニメーションは表示されません。

ルート アクティビティで「戻る」イベントをインターセプトする一般的なユースケースとしては、イベントのロギングが挙げられます。イベントのロギングは、ビューの OnBackPressedCallbackOnBackInvokedCallback の中、または addOnDestinationChangedListener や Compose の中ではなく、Fragment または Activity ライフサイクル メソッド内で行うことをおすすめします。詳しくは、コールバックに関するベスト プラクティスをご覧ください。

フラグメントのサポート

FragmentManager または Navigation コンポーネントを使用している場合、予測型「戻る」は以下のフラグメント API で、AnimatorAndroidX の遷移、一部のマテリアル モーション(MaterialSharedAxisMaterialFadeThroughMaterialFade など)を使用してサポートされます。

  • setCustomAnimations
  • setEnterTransition
  • setExitTransition
  • setReenterTransition
  • setReturnTransition
  • setSharedElementEnterTransition
  • setSharedElementReturnTransition

アニメーションフレームワークの遷移はサポートされません。

アプリで別のナビゲーション ライブラリを使用している場合は、そのライブラリのドキュメントで予測型「戻る」アニメーションがサポートされているかどうかを確認してください。

マテリアル ビュー コンポーネントのサポート

Android 14 以降を搭載したデバイスでは、予測型「戻る」アニメーションがマテリアル ビュー コンポーネントでサポートされます。その場合は、android:enableOnBackInvokedCallback マニフェスト フラグが有効になっており、compileSDK が API レベル 34 以降である必要があります。サポートされるマテリアル ビュー コンポーネントには、検索バー、ボトムシート、サイドシート、ナビゲーション ドロワーなどがあります。

マテリアル Compose コンポーネントのサポート

予測型「戻る」アニメーションは、マテリアル Compose コンポーネントでサポートされます。以下が該当します。

  • SearchBar
  • ModalBottomSheet
  • ModalNavigationDrawer/DismissibleNavigationDrawer

androidx.compose.material3:material3-*:1.3.0-alpha01 以降の依存関係を使用していることを確認してください。android:enableOnBackInvokedCallback マニフェスト フラグが有効になっている場合、SearchBar と ModalBottomSheet は自動的に予測型「戻る」アニメーションになります。ModalNavigationDrawer/DismissibleNavigationDrawer では、drawerState をそれぞれのシート コンテンツのコンポーザブルに渡す必要があります。

Compose での共有要素の遷移のサポート

Navigation Compose での予測型「戻る」による共有要素の遷移

予測型「戻る」をサポートするには、navigation-compose 2.8.0-alpha06 以降の依存関係を使用しており、AndroidManifest.xml ファイルに android:enableOnBackInvokedCallback="true" フラグが追加されていることを確認してください。

6. 解答コードを取得する

AndroidManifest.xml ファイルは次のようになります。

// AndroidManifest.xml

<application
  android:name=".SocialApp"
  ...
  android:enableOnBackInvokedCallback="true">
  <activity
    android:name=".MainActivity"
    android:exported="true"
    ...>

ui/Main.kt ファイル内の NavHost は次のようになります。

// Main.kt
NavHost(
  navController = navController,
  startDestination = "home",
  popEnterTransition = {
    scaleIn(
      animationSpec = tween(
        durationMillis = 100,
        delayMillis = 35,
      ),
      initialScale = 1.1F,
     ) + fadeIn(
         animationSpec = tween(
           durationMillis = 100,
           delayMillis = 35,
         ),
     )
   },
  popExitTransition = {
     scaleOut(
       targetScale = 0.9F,
     ) + fadeOut(
         animationSpec = tween(
           durationMillis = 35,
           easing = CubicBezierEasing(0.1f, 0.1f, 0f, 1f),
         ),
     )
   },
  modifier = modifier,
)

libs.versions.toml ファイルは次のようになります。

// libs.versions.toml

[versions]
...
media3 = "1.2.0"
navigation = "2.8.0-alpha07"
...

解答コードは main ブランチから取得できます。

解答コードを取得する手順は次のとおりです。

  1. SociaLite をダウンロード済みの場合は次のコマンドを実行します。

git checkout main

  1. SocialLite をまだダウンロードしていない場合は、main ブランチを表示するためもう一度コードをダウンロードします。

git clone git@github.com:android/socialite.git

7. 関連リンク

Android デベロッパー ドキュメント

Codelab