Android异形屏适配(官方方案)

Android异形屏适配(官方方案)

一、前言

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 定义,示例代码如下: