カットアウトについて

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

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

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

このページでは、カットアウト領域(カットアウトを含む表示サーフェスの長方形 全体)の活用方法など、 Compose でカットアウト付きのデバイスに対するサポートを実装する方法について説明します。

デフォルトの場合

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

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

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

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

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

Compose では、displayCutoutsafeContentsafeDrawing を使用して、コンポーザブルのカットアウト インセットを処理することをおすすめします。この方法では、必要に応じてディスプレイ カットアウトのパディングを尊重し、必要ない場合は無視できます。

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