[转载]一大波 Android 刘海屏来袭,全网最全适配技巧!
[原文地址](https://www.jianshu.com/p/5008b707bd04)
一、序
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 那些需要单独适配
就算是增加了刘海屏,你也可以发现,大部分都是“切割”的状态栏的区域,所以就面临了三种情况。
- 有状态栏的页面,不会收到刘海屏的影响。
- 全屏未适配刘海屏的页面,系统会对刘海屏区域进行切割,让整体 UI 页面做下移处理,避开刘海屏的显示。
- 全屏已适配刘海屏的页面,可以兼容刘海屏,做到真正的全屏显示。
后面会单独讲解这几种方式的区别。
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() {@Overridepublic 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/wiki/doc#id=10139
对于 OPPO 而言,它刘海的高度是固定的,就是 80px。
判断当前设备是否是刘海屏,也提供了对应的 Api,可以用以下方法获取。
context.getPackageManager().hasSystemFeature(“com.oppo.feature.screen.heteromorphism”)
返回 true 为刘海屏,但是这种方法只能识别 OPPO 品牌所支持的刘海屏。
四、结语
看完本篇文章,我想你对 Android 的刘海屏也有一定的认识了。这是一个全新的适配技术,现在还不确定不同厂商会不会对其微调,所以你要是碰到什么问题,不妨在留言区留言讨论。
[转载]一大波 Android 刘海屏来袭,全网最全适配技巧!相关推荐
- 一大波 Android 刘海屏来袭,全网最全适配技巧!
一.序 Hi,大家好,我是承香墨影! Apple 一直在引领设计的潮流,自从 iPhone X 发布之后,"刘海屏" 就一直存在争议.不过不管你怎样,Android 也要跻入 &q ...
- Android 刘海屏来袭,全网最全适配技巧
一.序 Hi,大家好,我是承香墨影! Apple 一直在引领设计的潮流,自从 iPhone X 发布之后,"刘海屏" 就一直存在争议.不过不管你怎样,Android 也要跻入 &q ...
- Android刘海屏适配精炼详解
一.前期基础知识储备 话不多说,这么多刘海屏手机今年集中爆发,所以尽管刘海屏不好看,但是还是要适配. 2017年苹果X开启了刘海屏时代,2018年集中爆发,纷纷采取刘海屏这一策略来实现全面屏的概念(看 ...
- android 刘海屏适配方法
背景 自从iphone x发布后,各大厂商也发布了类似的刘海屏手机("顶部屏幕凹槽设计"),开发者应该如何适配呢? 原理 为什么会有刘海屏? 因为大家有自拍的需求,需要摄像头前置, ...
- 一大波优秀3D作品来袭!看各国3D艺术家如何描绘2020!
已经迈入农历2021年,回望过去一年,如果要用一张图像去表达你的2020会是怎么样的呢? 散落在世界各地的3D艺术家们用3D作品分享了他们心中的2020. 下面就让我们一起来欣赏这些优秀的3D创作吧! ...
- Android刘海屏适配全方案(华为、小米、Vivo、Oppo)
前言 目前市面上的刘海屏和水滴屏手机越来越多了,颜值方面是因人而异,有的人觉得很好看,也有人觉得丑爆了,我个人觉得是还可以.但是作为移动开发者来说,这并不是一件好事,越来越多异形屏手机的出现意味着我们 ...
- Android 刘海屏适配
转载:原文链接 一.简介 随着 Apple 发布 iPhone X 之后,各大手机厂商也开始模仿这种刘海屏的设计,而且刘海屏手机的用户也是越来越大,前段时间将项目进行了所有主流厂商的刘海屏手机的适配, ...
- Android 系统(70)---Android刘海屏适配方案
Android刘海屏适配方案 什么是刘海屏 随着iPhone X发布,国内一些厂商也推出了刘海屏手机,即将发布的Android p也提供了对刘海屏的支持.so,我们的app也要提前做好适配. 屏幕的正 ...
- 详解Android刘海屏适配
Apple一直在引领设计的潮流,自从 iPhone X 发布之后,"刘海屏" 就一直存在争议,本以为是一个美丽的错误(Bug),却早就了一时间"刘海屏"的模仿潮 ...
最新文章
- zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器
- 一种在MVC3框架里面设置模板页的方法,不使用_ViewStart
- boost::multiprecision模块实现打印出所有的阶乘 这将适合一个 128 位整数相关的测试程序
- android任务 进程 线程详解,Android任务、进程、线程详解
- docker的安装与安装mysql(mac,centos为例)
- java 压缩jar 仓库,java服务安装(一):使用java service wrapper及maven打zip包
- 如何安装2个版本的python
- android adb工具命令大全
- 系统分析师和系统架构设计师的主要区别是什么?
- python随机森林回归数据实战
- 安卓手机做电脑摄像头(USB连接1080P 60FPS低延迟非常稳定)
- 并发和并行的区别?一个很容易混淆,被忽略的问题
- //数据结构:先序、中序、后序遍历二叉树。输入数据:abd##eg###c#f#h##
- PHPSTORM取消提示变量的黄色下滑波浪线
- 校招失败,在外包熬了 2 年后终于进了阿里
- McAfee阻止邮件发送功能
- 零基础带你硬核了解并上手“Ansible“!
- 软件测试面试(名企摸底:阿里,腾讯,360)
- 人工智能数学基础2:指数、方根及对数运算公式
- html表格列拖拽,table表格列顺序拖拽和列宽度拖拽
热门文章
- 75+精美的网格网站设计欣赏
- 学习SCI论文绘制技巧(A)
- 电脑创建QQ联系人快捷方式方法:
- win11时钟没有秒解决方法
- java毕业设计——基于java+J2ME的堡垒游戏设计与实现(毕业论文+程序源码)——堡垒游戏
- Parallels Desktop教程分享:如何设置全屏
- 【问题描述】假设今年工业产值为100万元,产值增产率从键盘输入,请编程计算工业产值经过多少年可以实现翻一番(即增加1倍)【输入形式】输入增产率 (float型数据),如输入10则表示增产率10%
- 入坑KeePass(四)KeePass通过坚果云WebDav同步方法
- ThinkPad S1 Yoga的混合硬盘怎样显示出来?求大
- Java 三年 26 K,还是被平均了!