一、前言
Android的异形屏,包括刘海屏,水滴屏、挖孔屏,起初是iOS设备上的杰作,有吐槽,也有赞美。刚出来不久,国内的各大厂商开始效仿,起初官方并没有API进行适配,一些厂商(例如小米、vivo)自己搞了刘海屏,只能用自己的API进行检测适配,这些就是蛋疼的事,通用的做法就是利用反射调用系统API进行判断,不过这篇文章不介绍这些设备的做法,毕竟从Android 9.0 (API Level 28)开始Android官方也出了刘海屏的适配支持,这里主要将官方的(因为现在国内各大厂商出的设备都是基于新系统,都支持官方API检测和适配)
二、异形屏适配详解
2.1 官方对带异形屏设备的要求
为了确保一致性和应用兼容性,官方对搭载 Android 9 的设备有以下要求:
- 一条边缘最多只能包含一个刘海。
- 一台设备不能有两个以上的刘海。
- 设备的两条较长边缘上不能有刘海。
- 在未设置特殊标志的竖屏模式下,状态栏的高度必须至少与刘海的高度持平。
- 默认情况下,在全屏模式或横屏模式下,整个刘海区域必须显示黑边。
2.2 处理异形屏
2.2.1 不隐藏系统状态栏的情形
如果应用所有界面均不隐藏状态栏,也就是应用不与系统状态栏重叠,那么就无需处理异形屏适配,系统状态栏会自动调整占据了异形切口的位置。如下图:

2.2.2 隐藏系统状态栏的情形
如果应用有界面是隐藏系统状态栏的(比如启动页,全屏游戏等),那么就要针对异形屏进行适配。
2.2.2.1 配置应用如何处理异形切口区域
隐藏了系统状态栏,意味着应用的内容将扩充到系统状态栏原有的位置,但是系统提供了控制是否在异形切口区域显示内容的配置,该配置是Window(窗口)级别属性,属性名为 layoutInDisplayCutoutMode。该属性有三个可选值,分别是:
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT- 这是默认行为。官方说明是在竖屏模式下,内容会呈现到刘海区域中;但在横屏模式下,内容会显示黑边。但是笔者才使用过程中,发现横屏和竖屏都是留黑边,不知道是不是跟系统有关(笔者使用官方模拟器和官方原生系统设备均是留黑边效果)WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES- 在竖屏模式和横屏模式下,内容都会呈现到刘海区域中。WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER- 内容从不呈现到刘海区域中。
可以通过了两种方法配置该属性:
- 在窗口主题样式文件中定义
在主题样式文件中通过android:windowLayoutInDisplayCutoutMode定义,示例代码如下:
<style name="Theme.DisplayCutoutDemo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- 其他属性配置 -->
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>

本文详细介绍Android异形屏(如刘海屏、水滴屏、挖孔屏)的官方适配要求与方法,包括如何处理不同场景下的系统状态栏显示问题,以及如何通过API获取并适配异形屏切口区域。
最低0.47元/天 解锁文章
2011

被折叠的 条评论
为什么被折叠?



