ウィンドウ インセットについて

ステータスバーやナビゲーション バーなどのシステム UI の描画は、Android プラットフォームが担当します。このシステム UI は、ユーザーが使用しているアプリに関係なく表示されます。

WindowInsets は、アプリが正しい領域に描画され、UI がシステム UI で隠れないように、システム UI に関する情報を提供します。

エッジ ツー エッジに対応してシステムバーの後ろに描画する
図 1. エッジ ツー エッジに対応し、システムバーの後ろに描画。

Android 14(API レベル 34)以前では、アプリの UI はデフォルトでシステムバーとディスプレイ カットアウトの下に描画されません。

Android 15(API レベル 35)以降では、アプリが SDK 35 をターゲットとすると、アプリはシステム バーの下に描画され、切り欠きが表示されます。これにより、よりシームレスなユーザー エクスペリエンスが実現し、アプリは利用可能なウィンドウ領域を最大限に活用できます。

システム UI の背後にコンテンツを表示することを、エッジ ツー エッジと呼びます。このページでは、さまざまな種類のインセット、エッジツーエッジにする方法、インセット API を使用して UI をアニメーション化し、アプリのコンテンツがシステム UI 要素に隠れないようにする方法について説明します。

インセットの基本

アプリがエッジ ツー エッジ表示になる場合は、重要なコンテンツや操作がシステム UI で隠れないようにする必要があります。たとえば、ボタンがナビゲーション バーの背後に配置されている場合、ユーザーがクリックできない可能性があります。

システム UI のサイズと配置場所に関する情報は、インセットで指定します。

システム UI の各部分には、サイズと配置場所を表す対応するタイプのインセットがあります。たとえば、ステータスバーのインセットはステータスバーのサイズと位置を指定しますが、ナビゲーション バーのインセットはナビゲーション バーのサイズと位置を指定します。各タイプのインセットは、上、左、右、下の 4 つのピクセル寸法で構成されます。これらのディメンションでは、システム UI がアプリのウィンドウの対応する側からどの程度延びるかを指定します。そのため、このようなシステム UI と重複しないように、アプリ UI をその分だけ内側に配置する必要があります。

次の Android 組み込みインセット タイプは、WindowInsets で使用できます。

WindowInsets.statusBars

ステータスバーを説明するインセット。通知アイコンやその他のインジケーターを含む、上部のシステム UI バーです。

WindowInsets.statusBarsIgnoringVisibility

ステータスバーは、表示されているときにインセットされます。ステータスバーが現在非表示になっている場合(没入感のある全画面モードに入ったため)、メインのステータスバーの切り欠きは空になりますが、これらの切り欠きは空ではありません。

WindowInsets.navigationBars

ナビゲーション バーを説明するインセット。デバイスの左側、右側、または下部にあるシステム UI バーで、タスクバーやナビゲーション アイコンを記述します。これらは、ユーザーが好むナビゲーション方法やタスクバーの操作に基づいて、実行時に変更される場合があります。

WindowInsets.navigationBarsIgnoringVisibility

ナビゲーション バーは、表示されているときにインセットされます。ナビゲーション バーが現在非表示になっている場合(没入型全画面モードに入ったため)、メイン ナビゲーション バーのインセットは空になりますが、これらのインセットは空ではありません。

WindowInsets.captionBar

フリーフォーム ウィンドウの場合、上部のタイトルバーなど、システム UI ウィンドウの装飾を説明するインセット。

WindowInsets.captionBarIgnoringVisibility

字幕バーは、表示されているときにインセットされます。字幕バーが現在非表示になっている場合、メインの字幕バーの切り欠きは空になりますが、これらの切り欠きは空ではありません。

WindowInsets.systemBars

ステータスバー、ナビゲーション バー、キャプション バーなどのシステムバーのインセットの統合。

WindowInsets.systemBarsIgnoringVisibility

システムバーは、表示されているときにインセットされます。システムバーが現在非表示になっている場合(没入型全画面モードに入ったため)、メインのシステムバーの切り欠きは空になりますが、これらの切り欠きは空ではありません。

WindowInsets.ime

ソフトウェア キーボードが占有する下部のスペースの量を示すインセット。

WindowInsets.imeAnimationSource

現在のキーボード アニメーションのにソフトウェア キーボードが占有していたスペースの量を示すインセット。

WindowInsets.imeAnimationTarget

現在のキーボード アニメーションのにソフトウェア キーボードが占有するスペースの量を示すインセット。

WindowInsets.tappableElement

ナビゲーション UI の詳細情報を記述するインセットの一種。アプリではなくシステムによって「タップ」が処理されるスペースの量を指定します。ジェスチャー ナビゲーションを使用する透明なナビゲーション バーの場合、一部のアプリ要素はシステム ナビゲーション UI からタップできます。

WindowInsets.tappableElementIgnoringVisibility

タップ可能な要素は、表示されているときにインセットされます。タップ可能な要素が現在非表示になっている場合(没入型全画面モードに入ったため)、メインのタップ可能な要素のインセットは空になりますが、これらのインセットは空ではありません。

WindowInsets.systemGestures

システムがナビゲーションのジェスチャーをインターセプトするインセットの量を表すインセット。アプリは、Modifier.systemGestureExclusion を使用して、これらのジェスチャーの処理を制限付きで手動で指定できます。

WindowInsets.mandatorySystemGestures

システム ジェスチャーのサブセット。常にシステムによって処理され、Modifier.systemGestureExclusion でオプトアウトできません。

WindowInsets.displayCutout

ディスプレイの切り欠き(ノッチまたはピンホール)と重ならないようにするために必要なスペースの量を表すインセット。

WindowInsets.waterfall

ウォーターフォール ディスプレイの湾曲した領域を表すインセット。ウォーターフォール ディスプレイは、画面の端にカーブした領域があり、画面がデバイスの側面を巻き込むように表示されます。

これらのタイプは、コンテンツが隠れないようにする 3 つの「安全な」インセット タイプにまとめられます。

これらの「安全な」インセット タイプは、基盤となるプラットフォームのインセットに基づいて、さまざまな方法でコンテンツを保護します。

  • システム UI の下に描画されないコンテンツを保護するには、WindowInsets.safeDrawing を使用します。これは、システム UI によって隠れているコンテンツ(部分的または完全に)を描画しないようにするための、インセットの最も一般的な用途です。
  • WindowInsets.safeGestures を使用して、ジェスチャーでコンテンツを保護します。これにより、システム ジェスチャーがアプリのジェスチャー(ボトムシート、カルーセル、ゲームなど)と競合するのを防ぐことができます。
  • WindowInsets.safeDrawingWindowInsets.safeGestures の組み合わせとして WindowInsets.safeContent を使用して、コンテンツの視覚的な重複やジェスチャーの重複がないようにします。