今回は、ジェスチャー ナビゲーションに関する連載の第 2 回です。他の回を見逃した方は、こちらからご覧になれます。
ジェスチャー ナビゲーション: エッジ ツー エッジへの対応
本連載の第 1 回では、アプリを「エッジ ツー エッジ」に対応させる方法をご紹介しました。ただしこの方法では、アプリのビューの一部がシステムバーの背後に隠れてしまい、ユーザーから見えなくなる場合があります。そこでこの投稿では、インセットを使用して、こうしたビューをシステムバーから離す方法を説明します。
この投稿では、「システム UI」と呼ばれる要素についても取り上げます。これは、システムが提供する画面上の UI の総称で、たとえばナビゲーション バーやステータスバー、通知パネルなどが該当します。
インセット
「インセット」と聞いて思わず尻込みした Android デベロッパーは、おそらく Android Lollipop の頃、ステータスバーの背後に描写しようとした経験があるのではないでしょうか。たとえば、このトピックに関するだいぶ前の
StackOverflow の質問 は、驚くほど多くの閲覧数を集めています 😲。
インセットは、画面のどの部分がシステム UI(ナビゲーション バーやステータスバーなど)と交差するかを表します。交差とは、単にコンテンツの上に表示されることを意味する場合もありますが、システム ジェスチャーに関係することもあります。インセットを使用することで、たとえば特定のビューを端から離すなどのようにして、重なり合いを避けることができます。
Android では、インセットは
WindowInsets クラス(AndroidX では
WindowInsetsCompat )で表されます。Android Q には、アプリのレイアウト時に考慮すべき 5 種類のインセットがあります。どのインセットを使用するかは状況に応じて異なります。それぞれのタイプについて詳しく見ていきましょう。
システム ウィンドウ インセット
メソッド:
getSystemWindowInsets()
システム ウィンドウ インセットは、現在最もよく使用されているインセットです。API 1 以降、さまざまな形式で存在するこのインセットは、システム UI が(Z 軸上で)アプリの上に表示されるときは常にビュー階層にディスパッチされます。代表的な例はステータスバーとナビゲーション バーですが、画面キーボード(IME)もこれに該当します。
アプリでシステム ウィンドウ インセットを使用する例を見てみましょう。ここで設定している
FloatingActionButton (FAB)は、画面の下隅に 16 dp の余白(
ガイドライン の仕様どおり)をとって配置されます。(ソースは
こちら )
エッジ ツー エッジ対応に変換する前の Google I/O アプリの FAB
前回の投稿 のステップ 1 と 2 を完了すると、ビューは下図のようにナビゲーション バー背後にまで広がって配置されるようになります。
全画面配置をリクエストした後の Google I/O アプリの FAB
このように、カンファレンスのスケジュール リストがナビゲーション バーの背後にまで拡張された状態は、ユーザーの没入感を高めるのに効果的です ✔️。リストとグリッドの処理方法については、後日別の投稿で説明します。
ところで、この例を改めて見てみると、FAB の一部が隠れてしまっているため、ユーザーがビューを操作(タップ)できない可能性があります。この種の視覚的な重なりは解消しなければなりません 🚫。上の図のように、デバイスがボタン ナビゲーション モードに設定されているときはバーが高くなるため、対応が必要なことはより明らかです。ジェスチャー ナビゲーション モードで動的な色調整が行われる場合は特に問題ありませんが、半透明スクリムに切り替わる可能性が常にあることを覚えておく必要があります。半透明スクリムになると、操作できなくなる場合があるためです。
この機会にすべてのナビゲーション モードでアプリをテストしておくことをおすすめします。
では、視覚的な重なりはどのように処理すればよいのでしょう。そこで出番となるのがシステム ウィンドウ インセットです。このインセットはビュー階層上のどの位置にシステムバーが配置されるかを表すので、その値を使用して、システムバーからビューを遠ざけることができます。
上の例では、FAB が下端と右端の近くに配置されています。そこで、systemWindowInsets.bottom および systemWindowInsets.right の値を大きくしてビューの下端と右端の余白を広くすることで、ナビゲーション バーから離すことができます。
この設定を適用すると、次のようになります。
これを正確に実装する方法については、この投稿の後半で詳しく説明します。
つまり、システム ウィンドウ インセットは、クリック可能なビューがシステムバーと重なって隠れてしまわないよう、そのビューを移動またはパディングする場合に活用できます。
タップ可能要素インセット
メソッド:
getTappableElementInsets()
次に紹介するのは、Android Q で新たに追加されたタップ可能要素インセットです。前述のシステム ウィンドウ インセットとよく似ていますが、こちらはナビゲーション バーの表示の変化に対応します。
実は、「タップ可能要素インセット」は無視して、代わりに「システム ウィンドウ インセット」を使用する方が便利です。次の「ジェスチャー インセット」にスキップしてかまいませんが、詳しく知りたい方は引き続きお読みください。🕵️
タップ可能要素インセットでは、クリック可能(タップ可能)なビューに適用される最小限のインセットを定義します。ここでの最小限とは、このインセットの値ではシステムバーと重なる部分が引き続き存在する場合があることを意味します。この点で、システムバーとの重なりを常に回避するシステム ウィンドウ インセットとは異なります。
FloatingActionButton の例を使って、2 つのインセットの値の違いを確認しましょう。
ピンク = ナビゲーション バーの領域。緑 = 下の余白に各インセットを指定した FAB の領域。
なお、ナビゲーション バーのサイズは変化するので、上の表の値はハードコードせず、インセットを使用してください。
「タップ可能要素インセット」と「システム ウィンドウ インセット」は、デバイスがボタン ナビゲーションに設定されているときは同様に機能することがわかります。違いが現れるのは、デバイスがジェスチャー ナビゲーションに設定され、かつ色調整が有効になっているときです。この状態ではナビゲーション バーは透明です。つまり、タップ可能なビューは理論上ナビゲーション バー内に配置可能であることから、下端の値が 0 になっています。
ただし、インセットではビューの配置場所を考慮しないため、タップ可能要素インセットを使用すると理論的に次のような結果になる可能性もあります。
これでは、ビューがナビゲーション バーに近過ぎて、ユーザーにとって紛らわしくなり適切とは言えません。
実際のところ、タップ可能要素インセットを使用できる状況でも、代わりに「システム ウィンドウ インセット」を使用した方がよい場合がほとんどです。
ジェスチャー インセット
メソッド:
getSystemGestureInsets() および
getMandatorySystemGestureInsets()
次に紹介するシステム ジェスチャー インセットも、Android Q で新たにプラットフォームに追加されたインセットです。ご存じのとおり、Android Q では新しいジェスチャー ナビゲーション モードが導入され、ユーザーは次の 2 種類のタッチ ジェスチャーでデバイスを操作できるようになりました。
画面の右端または左端から横にスワイプすると、「戻る」機能がトリガーされます。
画面の下端から上にスワイプすると、ホーム画面または最近使ったアプリを表示できます。
Android Q のジェスチャー ナビゲーションのデモ
システム ジェスチャー インセットは、システム ジェスチャーがアプリのタッチ操作より優先されるウィンドウの領域を表します。ところで、先ほど紹介した方法は 2 つありました。これは、システム ジェスチャー インセットが実際に 2 種類あるためです。すなわち、すべてのジェスチャー領域を含むインセットと、そのサブセットである必須システム ジェスチャー インセットです。
システム ジェスチャー インセット
1 番目のシステム ジェスチャー インセットについて説明します。このインセットには、システム ジェスチャーがアプリのタッチ操作より優先される画面上の領域全体が含まれます。Android Q では下の図のように、下のインセット(ホーム表示ジェスチャー用)と左右のインセット(戻るジェスチャー用)が設定された状態になります。
0
+--------------+
| |
| システム |
40 | ジェスチャー | 40
| インセット |
| |
+--------------+
60
では、デベロッパーがシステム ジェスチャー インセットを使用するのはどのような場合でしょうか。このインセットはシステム ジェスチャーが優先される場所を表します。つまり、このインセットを使えば、スワイプ操作が必要なビューの位置をあらかじめ決めておくことができます。
システム ジェスチャー インセットの使用が適している例としては、
下部のシート 、スワイプ操作を使用するゲーム、カルーセル(
ViewPager )などが挙げられます。一般に、このインセットは、スワイプ可能なビューを端から離れた位置に移動またはパディングする場合に使用します。
必須システム ジェスチャー インセット
必須システム ジェスチャー インセットはシステム ジェスチャー インセットのサブセットで、アプリによって除外できない(つまり「必須」の)領域のみが含まれます。詳しくは次回のブログ投稿(ジェスチャーの競合への対処方法の回)で説明しますが、ここではまず、アプリで画面の特定の部分からシステム ジェスチャーを排除できるということを覚えておいてください。
必須システム ジェスチャー インセットは、システム ジェスチャーが必須であり常に優先される画面の領域を表します。現在 Android Q で必須の領域は、画面下部のホーム表示用ジェスチャー領域のみです。ユーザーがいつでもアプリを終了できるようにするため、必須の領域となっています。
Android Q デバイスのジェスチャー インセットの一例を挙げるとすると、次の図のようになります。
0 0
+--------------+ +--------------+
| | | 必須 |
| システム | | システム |
40 | ジェスチャー | 40 0 | ジェスチャー | 0
| インセット | | インセット |
| | | |
+--------------+ +--------------+
60 60
システム ジェスチャー インセットでは左右と下部にインセットが設定されていますが、必須システム ジェスチャー インセットの方は、ホーム表示ジェスチャー用の下部のインセットしかありません。ジェスチャー領域の除外については、次回のブログ投稿で詳しく取り上げます。
固定インセット
メソッド:
getStableInsets()
最後にご紹介するのは、固定インセットです。ジェスチャー ナビゲーションと特に関連はありませんが、Android で利用できるインセットの一種ですので簡単に説明しておきます。
固定インセットはシステム ウィンドウ インセットと関係がありますが、システム UI が実際に表示される場所ではなく、表示される「可能性がある」場所を表します。固定インセットは主に、システム UI の表示のオンとオフを切り替え可能なモード(たとえば、ゲーム、フォトビューア、動画プレーヤーなどでよく使われる
リーンバック モードや
没入 モードなど)に設定されているときに使用されます。
インセットの処理
ここまでで、各インセットについて理解を深めていただけたことと思います。次は、これらのインセットを実際にアプリで使用する方法を見ていきましょう。
WindowInsets にアクセスする際は、主に
setOnApplyWindowInsetsListener メソッドを使用します。次に示すのは、ビューがナビゲーション バーの背後に表示されないようパディングを追加する例です。(ソースは
こちら )
ここでは、ビューの下部のパディングを、システム ウィンドウ インセットの下部の値に設定しています(具体的な数値は指定していません)。
注: ViewGroup でこれを行う場合は、必要に応じて android:clipToPadding="false" に設定してください。デフォルトでは、すべてのビューでパディング内の描画がクリップされるためです。この属性は RecyclerView でよく使用されます。詳しくは、今後別の投稿で取り上げたいと思います。
なお、リスナー関数には冪等性が必要です。リスナーが同じインセットで複数回呼び出される場合、結果は毎回同じでなければなりません。次に示すのは、冪等性がない関数の例です。(ソースは
こちら )
🙅 リスナーが呼び出されるたびにビューのパディングを追加(+=)してはいけません。ウィンドウ インセットのパスはいつでも、またビュー階層の存続中には複数回、発生する可能性があります。
Jetpack
インセットに関する注意点として、最小 SDK バージョンにかかわらず、
Jetpack の
WindowInsetsCompat を常に使用することをおすすめします。WindowInsets API は長年にわたって改良を重ね、拡張されています。この compat バージョンを使うことで、すべての API レベルで一貫した API と動作を実現できます。
Android Q で利用可能な新しい種類のインセットに対し、この compat メソッドは、すべての API レベルのホストデバイスに適した値を提供します。
AndroidX の新しい API を使用するには、androidx.core:core:1.2.0-xxx(現在のアルファ版)以降にアップデートしてください。最新バージョンについては
こちら で確認できます。
さらに先へ
上記でご紹介したのは WindowInsets[Compat] API を使用する最も簡単な方法ですが、コードが非常に冗長で反復的になる可能性もあります。今年前半に私が投稿したブログ記事では、バインディング アダプターを使用して、ウィンドウ インセットの処理を大幅に簡素化する方法をいくつかご紹介しました。詳しくはこちらをご覧ください。
WindowInsets — リスナーからレイアウトまで
この連載の次回の投稿では、アプリのジェスチャーがシステム ジェスチャーと競合した場合の対処方法について見ていきます。
Posted by
Yuichi Araki - Developer Relations Team
この記事は Chris Banes (Developer Programs Engineer) による Medium Blog の記事 "Gesture Navigation: Handling visual overlaps " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
今回は、ジェスチャー ナビゲーションに関する連載の第 2 回です。他の回を見逃した方は、こちらからご覧になれます。
ジェスチャー ナビゲーション: エッジ ツー エッジへの対応
本連載の第 1 回では、アプリを「エッジ ツー エッジ」に対応させる方法をご紹介しました。ただしこの方法では、アプリのビューの一部がシステムバーの背後に隠れてしまい、ユーザーから見えなくなる場合があります。そこでこの投稿では、インセットを使用して、こうしたビューをシステムバーから離す方法を説明します。
この投稿では、「システム UI」と呼ばれる要素についても取り上げます。これは、システムが提供する画面上の UI の総称で、たとえばナビゲーション バーやステータスバー、通知パネルなどが該当します。
インセット
「インセット」と聞いて思わず尻込みした Android デベロッパーは、おそらく Android Lollipop の頃、ステータスバーの背後に描写しようとした経験があるのではないでしょうか。たとえば、このトピックに関するだいぶ前の StackOverflow の質問 は、驚くほど多くの閲覧数を集めています 😲。
インセットは、画面のどの部分がシステム UI(ナビゲーション バーやステータスバーなど)と交差するかを表します。交差とは、単にコンテンツの上に表示されることを意味する場合もありますが、システム ジェスチャーに関係することもあります。インセットを使用することで、たとえば特定のビューを端から離すなどのようにして、重なり合いを避けることができます。
Android では、インセットは WindowInsets クラス(AndroidX では WindowInsetsCompat )で表されます。Android Q には、アプリのレイアウト時に考慮すべき 5 種類のインセットがあります。どのインセットを使用するかは状況に応じて異なります。それぞれのタイプについて詳しく見ていきましょう。
システム ウィンドウ インセット
メソッド: getSystemWindowInsets()
システム ウィンドウ インセットは、現在最もよく使用されているインセットです。API 1 以降、さまざまな形式で存在するこのインセットは、システム UI が(Z 軸上で)アプリの上に表示されるときは常にビュー階層にディスパッチされます。代表的な例はステータスバーとナビゲーション バーですが、画面キーボード(IME)もこれに該当します。
アプリでシステム ウィンドウ インセットを使用する例を見てみましょう。ここで設定している FloatingActionButton (FAB)は、画面の下隅に 16 dp の余白(ガイドライン の仕様どおり)をとって配置されます。(ソースはこちら )
エッジ ツー エッジ対応に変換する前の Google I/O アプリの FAB
前回の投稿 のステップ 1 と 2 を完了すると、ビューは下図のようにナビゲーション バー背後にまで広がって配置されるようになります。
全画面配置をリクエストした後の Google I/O アプリの FAB
このように、カンファレンスのスケジュール リストがナビゲーション バーの背後にまで拡張された状態は、ユーザーの没入感を高めるのに効果的です ✔️。リストとグリッドの処理方法については、後日別の投稿で説明します。
ところで、この例を改めて見てみると、FAB の一部が隠れてしまっているため、ユーザーがビューを操作(タップ)できない可能性があります。この種の視覚的な重なりは解消しなければなりません 🚫。上の図のように、デバイスがボタン ナビゲーション モードに設定されているときはバーが高くなるため、対応が必要なことはより明らかです。ジェスチャー ナビゲーション モードで動的な色調整が行われる場合は特に問題ありませんが、半透明スクリムに切り替わる可能性が常にあることを覚えておく必要があります。半透明スクリムになると、操作できなくなる場合があるためです。
この機会にすべてのナビゲーション モードでアプリをテストしておくことをおすすめします。
では、視覚的な重なりはどのように処理すればよいのでしょう。そこで出番となるのがシステム ウィンドウ インセットです。このインセットはビュー階層上のどの位置にシステムバーが配置されるかを表すので、その値を使用して、システムバーからビューを遠ざけることができます。
上の例では、FAB が下端と右端の近くに配置されています。そこで、systemWindowInsets.bottom および systemWindowInsets.right の値を大きくしてビューの下端と右端の余白を広くすることで、ナビゲーション バーから離すことができます。
この設定を適用すると、次のようになります。
これを正確に実装する方法については、この投稿の後半で詳しく説明します。
つまり、システム ウィンドウ インセットは、クリック可能なビューがシステムバーと重なって隠れてしまわないよう、そのビューを移動またはパディングする場合に活用できます。
タップ可能要素インセット
メソッド: getTappableElementInsets()
次に紹介するのは、Android Q で新たに追加されたタップ可能要素インセットです。前述のシステム ウィンドウ インセットとよく似ていますが、こちらはナビゲーション バーの表示の変化に対応します。
実は、「タップ可能要素インセット」は無視して、代わりに「システム ウィンドウ インセット」を使用する方が便利です。次の「ジェスチャー インセット」にスキップしてかまいませんが、詳しく知りたい方は引き続きお読みください。🕵️
タップ可能要素インセットでは、クリック可能(タップ可能)なビューに適用される最小限のインセットを定義します。ここでの最小限とは、このインセットの値ではシステムバーと重なる部分が引き続き存在する場合があることを意味します。この点で、システムバーとの重なりを常に回避するシステム ウィンドウ インセットとは異なります。
FloatingActionButton の例を使って、2 つのインセットの値の違いを確認しましょう。
ピンク = ナビゲーション バーの領域。緑 = 下の余白に各インセットを指定した FAB の領域。
なお、ナビゲーション バーのサイズは変化するので、上の表の値はハードコードせず、インセットを使用してください。
「タップ可能要素インセット」と「システム ウィンドウ インセット」は、デバイスがボタン ナビゲーションに設定されているときは同様に機能することがわかります。違いが現れるのは、デバイスがジェスチャー ナビゲーションに設定され、かつ色調整が有効になっているときです。この状態ではナビゲーション バーは透明です。つまり、タップ可能なビューは理論上ナビゲーション バー内に配置可能であることから、下端の値が 0 になっています。
ただし、インセットではビューの配置場所を考慮しないため、タップ可能要素インセットを使用すると理論的に次のような結果になる可能性もあります。
これでは、ビューがナビゲーション バーに近過ぎて、ユーザーにとって紛らわしくなり適切とは言えません。
実際のところ、タップ可能要素インセットを使用できる状況でも、代わりに「システム ウィンドウ インセット」を使用した方がよい場合がほとんどです。
ジェスチャー インセット
メソッド: getSystemGestureInsets() および getMandatorySystemGestureInsets()
次に紹介するシステム ジェスチャー インセットも、Android Q で新たにプラットフォームに追加されたインセットです。ご存じのとおり、Android Q では新しいジェスチャー ナビゲーション モードが導入され、ユーザーは次の 2 種類のタッチ ジェスチャーでデバイスを操作できるようになりました。
画面の右端または左端から横にスワイプすると、「戻る」機能がトリガーされます。
画面の下端から上にスワイプすると、ホーム画面または最近使ったアプリを表示できます。
Android Q のジェスチャー ナビゲーションのデモ
システム ジェスチャー インセットは、システム ジェスチャーがアプリのタッチ操作より優先されるウィンドウの領域を表します。ところで、先ほど紹介した方法は 2 つありました。これは、システム ジェスチャー インセットが実際に 2 種類あるためです。すなわち、すべてのジェスチャー領域を含むインセットと、そのサブセットである必須システム ジェスチャー インセットです。
システム ジェスチャー インセット
1 番目のシステム ジェスチャー インセットについて説明します。このインセットには、システム ジェスチャーがアプリのタッチ操作より優先される画面上の領域全体が含まれます。Android Q では下の図のように、下のインセット(ホーム表示ジェスチャー用)と左右のインセット(戻るジェスチャー用)が設定された状態になります。
0
+--------------+
| |
| システム |
40 | ジェスチャー | 40
| インセット |
| |
+--------------+
60
では、デベロッパーがシステム ジェスチャー インセットを使用するのはどのような場合でしょうか。このインセットはシステム ジェスチャーが優先される場所を表します。つまり、このインセットを使えば、スワイプ操作が必要なビューの位置をあらかじめ決めておくことができます。
システム ジェスチャー インセットの使用が適している例としては、下部のシート 、スワイプ操作を使用するゲーム、カルーセル(ViewPager )などが挙げられます。一般に、このインセットは、スワイプ可能なビューを端から離れた位置に移動またはパディングする場合に使用します。
必須システム ジェスチャー インセット
必須システム ジェスチャー インセットはシステム ジェスチャー インセットのサブセットで、アプリによって除外できない(つまり「必須」の)領域のみが含まれます。詳しくは次回のブログ投稿(ジェスチャーの競合への対処方法の回)で説明しますが、ここではまず、アプリで画面の特定の部分からシステム ジェスチャーを排除できるということを覚えておいてください。
必須システム ジェスチャー インセットは、システム ジェスチャーが必須であり常に優先される画面の領域を表します。現在 Android Q で必須の領域は、画面下部のホーム表示用ジェスチャー領域のみです。ユーザーがいつでもアプリを終了できるようにするため、必須の領域となっています。
Android Q デバイスのジェスチャー インセットの一例を挙げるとすると、次の図のようになります。
0 0
+--------------+ +--------------+
| | | 必須 |
| システム | | システム |
40 | ジェスチャー | 40 0 | ジェスチャー | 0
| インセット | | インセット |
| | | |
+--------------+ +--------------+
60 60
システム ジェスチャー インセットでは左右と下部にインセットが設定されていますが、必須システム ジェスチャー インセットの方は、ホーム表示ジェスチャー用の下部のインセットしかありません。ジェスチャー領域の除外については、次回のブログ投稿で詳しく取り上げます。
固定インセット
メソッド: getStableInsets()
最後にご紹介するのは、固定インセットです。ジェスチャー ナビゲーションと特に関連はありませんが、Android で利用できるインセットの一種ですので簡単に説明しておきます。
固定インセットはシステム ウィンドウ インセットと関係がありますが、システム UI が実際に表示される場所ではなく、表示される「可能性がある」場所を表します。固定インセットは主に、システム UI の表示のオンとオフを切り替え可能なモード(たとえば、ゲーム、フォトビューア、動画プレーヤーなどでよく使われるリーンバック モードや没入 モードなど)に設定されているときに使用されます。
インセットの処理
ここまでで、各インセットについて理解を深めていただけたことと思います。次は、これらのインセットを実際にアプリで使用する方法を見ていきましょう。
WindowInsets にアクセスする際は、主に setOnApplyWindowInsetsListener メソッドを使用します。次に示すのは、ビューがナビゲーション バーの背後に表示されないようパディングを追加する例です。(ソースはこちら )
ここでは、ビューの下部のパディングを、システム ウィンドウ インセットの下部の値に設定しています(具体的な数値は指定していません)。
注: ViewGroup でこれを行う場合は、必要に応じて android:clipToPadding="false" に設定してください。デフォルトでは、すべてのビューでパディング内の描画がクリップされるためです。この属性は RecyclerView でよく使用されます。詳しくは、今後別の投稿で取り上げたいと思います。
なお、リスナー関数には冪等性が必要です。リスナーが同じインセットで複数回呼び出される場合、結果は毎回同じでなければなりません。次に示すのは、冪等性がない関数の例です。(ソースはこちら )
🙅 リスナーが呼び出されるたびにビューのパディングを追加(+=)してはいけません。ウィンドウ インセットのパスはいつでも、またビュー階層の存続中には複数回、発生する可能性があります。
Jetpack
インセットに関する注意点として、最小 SDK バージョンにかかわらず、Jetpack の WindowInsetsCompat を常に使用することをおすすめします。WindowInsets API は長年にわたって改良を重ね、拡張されています。この compat バージョンを使うことで、すべての API レベルで一貫した API と動作を実現できます。
Android Q で利用可能な新しい種類のインセットに対し、この compat メソッドは、すべての API レベルのホストデバイスに適した値を提供します。AndroidX の新しい API を使用するには、androidx.core:core:1.2.0-xxx(現在のアルファ版)以降にアップデートしてください。最新バージョンについてはこちら で確認できます。
さらに先へ
上記でご紹介したのは WindowInsets[Compat] API を使用する最も簡単な方法ですが、コードが非常に冗長で反復的になる可能性もあります。今年前半に私が投稿したブログ記事では、バインディング アダプターを使用して、ウィンドウ インセットの処理を大幅に簡素化する方法をいくつかご紹介しました。詳しくはこちらをご覧ください。
WindowInsets — リスナーからレイアウトまで
この連載の次回の投稿では、アプリのジェスチャーがシステム ジェスチャーと競合した場合の対処方法について見ていきます。
Posted by Yuichi Araki - Developer Relations Team