Android プラットフォームは、ステータスバーやナビゲーション バーなどのシステム UI の描画を担当します。このシステム UI は、ユーザーが使用しているアプリに関係なく表示されます。
WindowInsets は、アプリが正しい領域に描画され、UI がシステム UI によって隠されないように、システム UI に関する情報を提供します。
Android 14(API レベル 34)以前では、アプリの UI はデフォルトでシステムバーとディスプレイ カットアウトの下に描画されません。
Android 15(API レベル 35)以降では、アプリが SDK 35 をターゲットにすると、アプリはシステムバーとディスプレイ カットアウトの下に描画されます。これにより、ユーザー エクスペリエンスがよりシームレスになり、アプリは利用可能なウィンドウ スペースを最大限に活用できます。
システム UI の背後にコンテンツを表示することを、エッジ ツー エッジ対応と呼びます。 このページでは、さまざまな種類のインセット、エッジ ツー エッジ対応の方法、インセット API を使用して UI をアニメーション化し、アプリのコンテンツがシステム UI 要素によって隠されないようにする方法について説明します。
インセットの基本
アプリがエッジ ツー エッジ対応の場合、重要なコンテンツや操作がシステム UI によって隠されないようにする必要があります。たとえば、ボタンがナビゲーション バーの背後に配置されている場合、ユーザーがクリックできない可能性があります。
システム UI のサイズと配置場所に関する情報は、インセットで指定します。
システム UI の各部分には、サイズと配置場所を記述する対応するタイプのインセットがあります。たとえば、ステータスバーのインセットはステータスバーのサイズと位置を提供し、ナビゲーション バーのインセットはナビゲーション バーのサイズと位置を提供します。各タイプのインセットは、上、左、右、下の 4 つのピクセル寸法で構成されます。これらの寸法は、システム UI がアプリのウィンドウの対応する辺からどの程度拡張されるかを指定します。したがって、そのタイプのシステム UI と重複しないようにするには、アプリの UI をその分だけインセットする必要があります。
Android に組み込まれている次のインセットタイプは、WindowInsets を介して使用できます。
ステータスバーを記述するインセット。通知アイコンやその他のインジケーターを含む、上部のシステム UI バーです。 |
|
表示されている場合のステータスバーのインセット。ステータスバーが現在非表示になっている場合(イマーシブ全画面モードに入っている場合)、メインのステータスバーのインセットは空になりますが、このインセットは空ではありません。 |
|
ナビゲーション バーを記述するインセット。デバイスの左側、右側、下部にあるシステム UI バーで、タスクバーまたはナビゲーション アイコンを記述します。これらは、ユーザーが選択したナビゲーション方法やタスクバーの操作に基づいて、実行時に変更される可能性があります。 |
|
表示されている場合のナビゲーション バーのインセット。ナビゲーション バーが現在非表示になっている場合(イマーシブ全画面モードに入っている場合)、メインのナビゲーション バーのインセットは空になりますが、このインセットは空ではありません。 |
|
フリーフォーム ウィンドウの場合、上部のタイトルバーなど、システム UI ウィンドウの装飾を記述するインセット。 |
|
表示されている場合のキャプション バーのインセット。キャプション バーが現在非表示になっている場合、メインのキャプション バーのインセットは空になりますが、このインセットは空ではありません。 |
|
ステータスバー、ナビゲーション バー、キャプション バーを含む、システムバーのインセットの和集合。 |
|
表示されている場合のシステムバーのインセット。システムバーが現在非表示になっている場合(イマーシブ全画面モードに入っている場合)、メインのシステムバーのインセットは空になりますが、このインセットは空ではありません。 |
|
ソフトウェア キーボードが占有する下部のスペースの量を記述するインセット。 |
|
現在のキーボード アニメーションの前にソフトウェア キーボードが占有していたスペースの量を記述するインセット。 |
|
現在のキーボード アニメーションの後にソフトウェア キーボードが占有するスペースの量を記述するインセット。 |
|
ナビゲーション UI に関する詳細情報を記述するインセットのタイプ。タップがアプリではなくシステムによって処理されるスペースの量を指定します。ジェスチャー ナビゲーションを使用する透過的なナビゲーション バーの場合、一部のアプリ要素はシステム ナビゲーション UI を介してタップできます。 |
|
表示されている場合のタップ可能な要素のインセット。タップ可能な要素が現在非表示になっている場合(イマーシブ全画面モードに入っている場合)、メインのタップ可能な要素のインセットは空になりますが、このインセットは空ではありません。 |
|
システムがナビゲーションのジェスチャーをインターセプトするインセットの量を表すインセット。アプリは、 |
|
システムによって常に処理されるシステム ジェスチャーのサブセット。 |
|
ディスプレイ カットアウト(ノッチまたはピンホール)との重複を避けるために必要なスペースの量を表すインセット。 |
|
ウォーターフォール ディスプレイの曲線領域を表すインセット。ウォーターフォール ディスプレイには、画面の端に沿って曲線領域があり、デバイスの側面に沿って画面が折り返されます。 |
これらのタイプは、コンテンツが隠されないようにする 3 つの「安全な」インセットタイプにまとめられています。
これらの「安全な」インセットタイプは、基盤となるプラットフォームのインセットに基づいて、さまざまな方法でコンテンツを保護します。
WindowInsets.safeDrawingを使用して、システム UI の下に描画しないコンテンツを保護します 。これは、インセットの最も一般的な使用方法です。システム UI によって隠されるコンテンツ(部分的または完全に)の描画を防ぎます。WindowInsets.safeGesturesを使用して、ジェスチャーを含むコンテンツを保護します。これにより、システム ジェスチャーがアプリのジェスチャー(ボトムシート、カルーセル、ゲームなど)と競合するのを防ぎます。WindowInsets.safeContentをWindowInsets.safeDrawingとWindowInsets.safeGesturesの組み合わせとして使用すると、 コンテンツの視覚的な重複や操作の重複を防ぐことができます。
あなたへのおすすめ
- 注: JavaScript がオフになっている場合はリンクテキストが表示されます
- マテリアル コンポーネントとレイアウト
CoordinatorLayoutを Compose に移行する- その他の考慮事項