一大波 Android 刘海屏来袭,全网最全适配技巧!

2023-11-16

一、序

Hi,大家好,我是承香墨影!

Apple 一直在引领设计的潮流,自从 iPhone X 发布之后,"刘海屏" 就一直存在争议。不过不管你怎样,Android 也要跻入 "刘海屏" 的行列,尤其是 Android P 发布之后,也从系统级支持顶部凹槽屏幕设计。

很多厂商也在逐渐推出 “刘海屏” 设计的手机,在国内比较常见的就是 OPPO R15 和 华为 P20。

屏幕不一样了,迎来的就是一些适配上的问题。今天就来聊聊,Android 的 “刘海屏”,以及我们如何去适配它。

二、刘海屏的背景介绍

2.1 背景介绍

刘海屏的外观,我想大家应该都有概念,不过不同厂商刘海屏的实现方式也有所不太,这一点需要先有个概念。

就现在市场上的情况来说,会区分成两类,一类是标准的 Android P Api,另外一类就是厂商在 Android P 以下的系统,做的特殊适配。

例如:华为 P20 就是采用的 Android P 标准 Api 的方式,而 OPPO R15 就不一样了,它有自己的适配 Api。

2.2 那些需要单独适配

就算是增加了刘海屏,你也可以发现,大部分都是“切割”的状态栏的区域,所以就面临了三种情况。

  1. 有状态栏的页面,不会收到刘海屏的影响。
  2. 全屏未适配刘海屏的页面,系统会对刘海屏区域进行切割,让整体 UI 页面做下移处理,避开刘海屏的显示。
  3. 全屏已适配刘海屏的页面,可以兼容刘海屏,做到真正的全屏显示。

后面会单独讲解这几种方式的区别。

2.3 抢先体验 Android P

在手边没有对应系统的设备的时候,模拟器是一条不错的路,最近 Google 也发布了 Android P 的模拟器,还有一个办法就是找一些支持真机云测的平台,租用一台需要的远程设备,也是一个解决方案。

我这里选择 Android P 的模拟器,有需要自己更新 SDK ,无脑下载更新就好。

刘海的凹槽区域,大部分是为了给摄像头或者其他传感器留出区域。而在没有刘海的设备或者模拟器上,可以通过开发者选项里的 “Simulate a display with a cutout”,开启刘海屏的支持。

如果你把所有的模式都试过一遍,你会发现,其实刘海屏的刘海,在 Android P 上,是有多种样式的,并非统一的。

2.4 刘海屏的适配

2.2 也讲清楚了,刘海屏的切割区域,都存在于状态栏上,所以在有状态栏的页面上,是无需我们特殊处理的,系统会帮我们处理好。

而对于全屏的页面,就需要单独的处理了。我这里,简单做了一个全屏页面,每个横条都是等宽的这样能看到布局上的差异。

从左至右分别是:关闭刘海屏、开启刘海屏但不支持、适配刘海屏。

一个全屏的页面,当没有支持刘海屏又碰到了刘海屏,会导致 UI 下沉,如果这不是一个列表的布局,底部的控件就会被遮挡。

例如下面这样的情况:

图片来自:华为适配指南

还有一些被刘海遮挡区域的效果,其实主要是依赖 UI 设计师来规避了,不要在可能出现刘海切割的地方,设计可操作的区域,影响用户操作。

三、技术适配刘海屏

说那么多,最终我们还是需要用技术的方式来适配刘海屏。Android P 的刘海屏,是有标准的 Api 来进行适配,而对于一些厂商自己的刘海屏设备,例如:OPPO R15,就需要遵循它的开发文档进行单独适配。

Android P 为最新的刘海屏,提供了专门的 Api 来支持:DisplayCutout。

3.1 开启刘海屏

我们在全屏的页面,需要单独开启支持刘海屏。而 Google 提供的适配方案,可以设置是否在全屏模式下,使用刘海屏的区域。

WindowManager.LayoutParams lp
                =getWindow().getAttributes();
lp.layoutInDisplayCutoutMode =
                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
getWindow().setAttributes(lp);

新的布局属性 layoutInDisplayCutoutMode 包含三种可选的模式,

public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS = 1;
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0;
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2;

3.2 刘海屏的高度

在全屏模式下,我们需要有办法获取到刘海屏凹槽的高度,才可以做到设计和布局的时候,留出安全距离。

虽然 Google 要求,刘海屏的凹槽,必须和刘海的高度保持一致,而刘海屏又被隐藏在状态栏了,所以有一个思路是直接获取状态栏的高度,来判断刘海之外,可布局的安全区域。

不过 Android P 已经预留出了标准的测量 刘海屏凹槽 的 Api:DisplayCutout

刘海屏的凹槽,就在屏幕的中间,所以只有 getSafeInsetTop() 方法返回的结果,是我们需要的,而其他的 getSafeInsetXxx() 方法,直接返回的是 0 。

view.postDelayed(new Runnable() {
    @Override
    public void run() {
        DisplayCutout displayCutout = view.getRootWindowInsets().getDisplayCutout();
        Log.i("cxmyDev", "SafeInsetBottom:" + displayCutout.getSafeInsetBottom());
        Log.i("cxmyDev", "SafeInsetLeft:" + displayCutout.getSafeInsetLeft());
        Log.i("cxmyDev", "SafeInsetRight:" + displayCutout.getSafeInsetRight());
        Log.i("cxmyDev", "SafeInsetTop:" + displayCutout.getSafeInsetTop());
    }
}, 100);

得到的结果,也可以看一下:

I/cxmyDev: SafeInsetBottom:0
I/cxmyDev: SafeInsetLeft:0
I/cxmyDev: SafeInsetRight:0
I/cxmyDev: SafeInsetTop:112

3.3 非标准 Api

像 OPPO 这样的厂商,实现刘海屏的方式,也并不是按照 Android P 的标准做的,它完全是自己修改了刘海屏的实现方式。不过好在,都是会提供完备的适配文档,这就需要我们直接阅读他们提供的开发文档来进行适配。

oppo 的刘海屏适配文档:

https://open.oppomobile.com/w...

对于 OPPO 而言,它刘海的高度是固定的,就是 80px。

判断当前设备是否是刘海屏,也提供了对应的 Api,可以用以下方法获取。

context.getPackageManager().hasSystemFeature(“com.oppo.feature.screen.heteromorphism”)

返回 true 为刘海屏,但是这种方法只能识别 OPPO 品牌所支持的刘海屏。

四、结语

看完本篇文章,我想你对 Android 的刘海屏也有一定的认识了。这是一个全新的适配技术,现在还不确定不同厂商会不会对其微调,所以你要是碰到什么问题,不妨在留言区留言讨论。

今天在公众号后台回复成长『 成长』,将会得到我整理的一些学习资料,也能回复『 加群』,一起学习进步。

推荐阅读:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一大波 Android 刘海屏来袭,全网最全适配技巧! 的相关文章

随机推荐

  • invalid resource directory name

    遇到错误 当有res navigation的时候 反编译打包回apk的时候会报错 invalid resource directory name res navigation 或者是 invalid resource directory n
  • 【CV】第 15 章:结合计算机视觉和 NLP 技术

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • pc微信禁止启动小程序

    场景 最近 Windows 微信的更新了可以访问小程序的功能 但还不完善 如 尝试播放激励视频时 会直接跳过视频并作为已完成处理等 身为开发者的我们可能需要做一些处理 禁止pc的微信访问小程序 以达到减小损失的目的 提要 App onLau
  • Google Cast(Chromecast)浏览器 SDK 学习笔记(一)

    前几天因为京东打折 买了个索尼的 SRS X77 音箱 看说明书说支持 Google Cast 试了试感觉还挺好用 于是研究了一下 Google Cast 的 SDK Chromecast Google Cast 傻傻分不清楚 Google
  • Python迭代器及其用法

    列表 list 元组 tuple 字典 dict 集合 set 这些序列式容器有一个共同的特性 它们都支持使用 for 循环遍历存储的元素 都是可迭代的 因此它们又有一个别称 即迭代器 从字面来理解 迭代器指的就是支持迭代的容器 更确切的说
  • Umi4各种运行报错排查

    使用 Umi4 搭建项目 选择antd pro模版 pnpm 运行起来以后VScode编译器中出现报红 但是项目正常运行 现在强迫症处理各种报红 如果有用请点个赞 o 1 Cannot find module umi or its corr
  • windows平台对NUMA的支持

    微软官网链接 https docs microsoft com en us windows win32 procthread numa support 译文如下 多处理器支持的传统模型是对称多处理器 SMP 在这种模型中 每个处理器对内存和
  • go mod 引入指定的分支

    方式一 执行以下命令 go get git地址 分支名 如 go get github com golang go master 方式二 直接在go mod文件中添加 格式如下 git地址 v0 0 0 时间戳 commint id 例如
  • webpack静态资源地址注入html,HtmlWebpackPlugin

    说明 插件的基本作用就是生成 html 文件 原理很简单 将 webpack 中entry配置的相关入口 chunk 和 extract text webpack plugin抽取的 css 样式 插入到该插件提供的template或者te
  • 拼多多电商玩家快速采集平台数据

    作为电商卖家 选款是一件很重要的事情 所以我们在选款上面需要下大功夫分析数据 如何第一时间知晓同类商品及其价格 如何实时采集到新款 爆款 及其价格 下面我对比两种方法 看看哪种方式更适合我们普通电商从业人员 目标 抓取拼多多某类商品的列表页
  • 学习Python数据分析有什么用?

    在当今信息爆炸的时代 数据成为了各行各业中不可或缺的资源 而Python作为一种高级编程语言 拥有强大的数据分析能力 本文将详细介绍学习Python数据分析的重要性以及它在实际应用中的用途 帮助读者更好地了解并学习Python数据分析 一
  • 基于ARIMA-CNN-LSTM预测模型研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 A IMA 模型 1 2 CNN LSTM 模型 2 运行结果 3 参考文献 4 Python代码
  • 使用SDWAN构建安全的混合WAN

    使用SD WAN构建安全的混合WAN SDWAN的爆炸已成为头条新闻了一年多 企业正在以惊人的速度采取SDWAN 不但可以为分支机构提供更灵活的连接和利用程序性能 而且可以跨全部网络提供 远程 超级用户 依托SDWAN 通过将小型台式机装备
  • 博途 V15.1安装步骤

    温馨提醒 安装此软件电脑配置至少应满足以下要求 处理器 CoreTM i5 3320M 3 3 GHz 或相当 内存 至少8G 硬盘 300 GB SSD 显示器 15 6 宽屏显示 1920 x 1080 1 双击打开 Siemens v
  • 小程序代码提审用户隐私保护协议修改指引

    为规范开发者的用户个人信息处理行为 保障用户合法权益 小程序涉及处理用户个人信息的开发者 均需补充相应用户隐私保护指引 微信会根据小程序版本隐私接口调用情况展示必填项 开发者可自主勾选其他项目 一 代码提审版本用户隐私保护指引填写入口 管理
  • 用c99 写的简单线程池类

    include
  • [培训-DSP快速入门-6]:C54x DSP开发中C语言库函数的使用

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119010855 目录 第1章
  • 14 代码分割之lazy:Suspense与路由懒加载

    lazy内置方法 Suspense内置组件 lazy是React提供的懒 动态 加载组件的方法 React lazy 能减少打包体积 延迟加载首屏不需要渲染的组件 依赖内置组件Suspense 给lazy加上loading指示器组件的一个容
  • 【面试题】前端开发中如何高效渲染大数据量?

    前端面试题库 面试必备 推荐 地址 前端面试题库 国庆头像 国庆爱国 程序员头像 总有一款适合你 在日常工作中 较少的能遇到一次性往页面中插入大量数据的场景 数栈的离线开发 以下简称离线 产品中 就有类似的场景 本文将分享一个实际场景中的前
  • 一大波 Android 刘海屏来袭,全网最全适配技巧!

    一 序 Hi 大家好 我是承香墨影 Apple 一直在引领设计的潮流 自从 iPhone X 发布之后 刘海屏 就一直存在争议 不过不管你怎样 Android 也要跻入 刘海屏 的行列 尤其是 Android P 发布之后 也从系统级支持顶