カットアウトについて

ディスプレイ カットアウトとは、一部のデバイスでディスプレイの表面にまで及ぶ領域のことです。これにより、デバイスの前面に重要なセンサーのスペースを確保しながら、エッジ ツー エッジのエクスペリエンスを実現できます。

縦向きモードでのカットアウトの例
図 1. ポートレート モードでのカットアウトの例
横表示でのカットアウトの例
図 2. 横表示でのカットアウトの例

Android 9(API レベル 28)以降を搭載しているデバイスでは、ディスプレイ カットアウトがサポートされています。ただし、デバイス メーカーは、Android 8.1 以前を搭載したデバイスでもディスプレイ カットアウトをサポートできます。

このページでは、Compose でカットアウトのあるデバイスのサポートを実装する方法について説明します。これには、カットアウト領域(カットアウトを含むディスプレイ表面のエッジツーエッジの長方形)を操作する方法も含まれます。

デフォルトの場合

対象 API レベル 34 以下をターゲットとするアプリ、または enableEdgeToEdge を呼び出さない Activity は、アプリがディスプレイ カットアウトを含むシステムバーに描画しない限り、デフォルトではカットアウト領域に描画されません。

Android 15 以降を搭載したデバイスで API レベル 35 以降をターゲットとするアプリ、または enableEdgeToEdge を呼び出すアクティビティは、カットアウト領域に描画されます。

つまり、Android 15 以降を搭載したデバイスで API レベル 35 以降をターゲットとするアプリの非フローティング ウィンドウでは、LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT、LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES、LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER は LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS と解釈されます。

カットアウト情報を手動で処理する

カットアウト領域が、重要なテキスト、コントロール、または細かいタッチ認識を必要とするインタラクティブ要素を隠さないように、カットアウト情報を処理する必要があります(カットアウト領域ではタッチ感度が低くなる可能性があります)。カットアウトを処理する際は、ステータスバーの高さをハードコードしないでください。コンテンツが重なったり、カットされたりする可能性があります。代わりに、次のいずれかの方法でカットアウトを処理します。

Compose の場合は、displayCutout、safeContent、safeDrawing を使用して、コンポーザブルでカットアウト インセットを処理することをおすすめします。このアプローチにより、必要に応じてディスプレイ カットアウトのパディングを考慮したり、不要な場合は無視したりできます。

Canvas(modifier = Modifier.fillMaxSize().windowInsetsPadding(WindowInsets.displayCutout)) {
    drawRect(Color.Red, style = Stroke(2.dp.toPx()))
}