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

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 と重複しないようにするには、アプリの 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.safeContentWindowInsets.safeDrawingWindowInsets.safeGestures の組み合わせとして使用すると、 コンテンツの視覚的な重複や操作の重複を防ぐことができます。