Android刘海屏适配
背景:公司采购小米8SE后,专门用来做刘海屏的适配测试。本文主要针对小米手机做了适配,华为或其他机型没有在真机上测试过,如有问题欢迎提出。
接下来还是废话不多说,放几张公司手机适配后的样式。
Snip20181218_31.png 往上滑动后,页面效果1.1 适配全面屏
小米刘海屏手机大部分采用的是全面屏幕,所以应该先适配全面屏幕。主要是设置一个meta-data节点
<meta-data
android:name="android.max_aspect"
android:value="ratio_float" />
截图来自小米官方文档
1.2 适配刘海屏
先来定义几个概念,如下图:
截图来自小米官方文档小米的适配整体规则如下,主要几个容易混淆的概念:status bar隐藏与显示和透明状态栏之间是什么样的关系,全屏模式到底是什么?下文将一一解答这些问题,理解这些关系后,其他问题就比较容易理解和实施了。
image.png image.png1.2.1 是否显示status bar
我项目中使用的就是默认模式,所以本文只针对默认模式进行一些说明。默认模式下,只有在竖屏和非全屏下才有使用耳朵区的权限。
小米官方文档,关于android O刘海屏的解释,有点懵,可能是因为没有完全明白显示status bar和不显示status bar的概念。而android P这边则有可能对全屏的理解有误差,整理一下几个概念。
不显示status bar:隐藏状态栏,就是把含有电量,网络等标志的状态栏给gone掉。注意这里的gone掉,是完全看不到状态栏,例如,视频播放,游戏等情形下。
具体的代码设置如下,注意全面屏的flag为View.SYSTEM_UI_FLAG_FULLSCREEN:
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_FULLSCREEN);
显示status bar:这时,可以分成两种情况,一种就是默认状态栏,还有一种是透明状态栏,注意透明状态栏也是显示status bar的,这里很容易产生误解。
1.2.2 是否是全屏模式
文档中介绍的全屏模式:隐藏状态栏;
不隐藏状态栏则可以分为两种情况:透明状态栏,默认状态栏。
对应与代码中的flag标志:
透明状态栏:View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
全屏(状态栏隐藏):View.SYSTEM_UI_FLAG_FULLSCREEN。
1.3 总结
第一种情况:
android P之前:只存在默认模式,也就是说,非全屏 + 竖屏就有权限使用耳朵区,具体使用方式,其实和低版本适配状态栏一致,只是这个状态栏是一个包含刘海的状态栏。可参考我的文章Android透明状态栏与状态栏文字颜色更改。
第二种情况:
android P之后:有三种模式可以使用,如果在默认禁止的情况下使用
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
则可以开始使用耳朵区,那么此时就需要对页面进行适配,通过获取到的刘海屏的宽高,对页面进行相应的更改。