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

Android プラットフォームは、ステータスバーやナビゲーション バーなどのシステム UI を描画する役割を担っています。このシステム 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 はその分だけインセットする必要があります。

これらの組み込みの 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 つの「安全な」インセット タイプにまとめられています。

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

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