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

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

一、前言

    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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值