关于刘海屏

显示刘海屏是某些设备上延伸到显示表面的区域。它实现了全屏体验,同时为设备正面的重要传感器提供了空间。

Cutout example in portrait mode
图 1. 竖屏模式下的刘海屏示例
Cutout example in landscape mode
图 2. 横屏模式下的刘海屏示例

Android 支持运行 Android 9 (API 级别 28) 及更高版本的设备上的显示刘海屏。但是,设备制造商也可以支持运行 Android 8.1 或更低版本的设备上的显示刘海屏。

本页面介绍如何在 Compose 中实现对带刘海屏设备的支持,包括如何使用刘海屏区域——即显示表面上包含刘海屏的全屏矩形。

默认情况

默认情况下,除非应用绘制到包含显示刘海屏的系统栏中,否则目标 API 级别为 34 或更低的应用,或未调用 enableEdgeToEdge 的 Activity,不会绘制到刘海屏区域。

目标 API 级别为 35 或更高版本(运行 Android 15 或更高版本)的设备上的应用,或调用 enableEdgeToEdge 的 Activity,会绘制到刘海屏区域。

换句话说,对于目标 API 级别为 35 或更高版本(运行 Android 15 或更高版本)的应用中的非浮动窗口,LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULTLAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGESLAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 被解释为 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS

手动处理刘海屏信息

您必须处理刘海屏信息,以防止刘海屏区域遮挡重要的文本、控件或需要精细触摸识别的互动元素(刘海屏区域的触摸灵敏度可能较低)。处理刘海屏时,不要硬编码状态栏高度,因为这可能导致内容重叠或被截断。相反,请通过以下任何一种方式处理刘海屏:

对于 Compose,我们建议您使用 displayCutoutsafeContentsafeDrawing 在您的可组合项中处理刘海屏内边距。这种方法允许您在需要时尊重显示刘海屏填充,或在不需要时忽略它。

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