随着iPhone X发布,国内一些厂商也推出了刘海屏手机,即将发布的Android p也提供了对刘海屏的支持。so,我们的app也要提前做好适配。
1
什么是刘海屏?
屏幕的正上方居中位置(下图黑色区域)会被挖掉一个孔,屏幕被挖掉的区域无法正常显示内容,这种类型的屏幕就是刘海屏,也有其他叫法:挖孔屏、凹凸屏等等,这里统一按刘海屏命名。
![76a6e612b3199766b4e9c80906c38ea8.png](https://i-blog.csdnimg.cn/blog_migrate/fdbf27c70f82be9e3d8cd18a2a13ea12.jpeg)
目前国内厂商已经推出的刘海屏Android手机有华为P20 pro, vivo X21,OPPO R15。
如果没有适配刘海屏会有什么后果?
后果一:导航栏中title被遮挡
![4c81d81900061d825b31dc978626dab1.png](https://i-blog.csdnimg.cn/blog_migrate/bab00a1cbf6db62260523c06bc452eeb.jpeg)
未适配刘海屏1
后果二:显示内容下移,头部出现黑条,底部出现遮挡
![d498536dc13cfbea89cf3f6a6d8bf6cd.png](https://i-blog.csdnimg.cn/blog_migrate/4c5d4738acc4705be1340c0c6460ca5e.jpeg)
未适配刘海屏2
2
如何适配刘海屏?
由于Android p正式版今日刚发布, 当前市面上的Android 刘海屏手机还不能用Android 官方提供的方案来解决,那怎么办呢?还好几个厂商自己给出了适配方案。我们先讲理论后上代码,如果您只想要代码就直接往下翻:
华为P20 pro
华为刘海屏适配官方文档
https://devcenter-test.huawei.com/consumer/cn/devservice/doc/50114
华为给出的文档最为详细(业界良心),P20 pro预装系统对未做刘海屏适配处理的app有一定处理,处理逻辑如下
![d76fae58430a886fa1cb24b25615d4c5.png](https://i-blog.csdnimg.cn/blog_migrate/9cc45a9267311e6c9e471bf47b8ca69c.jpeg)
预处理流程图
可见,会被华为系统做偏移处理的有2种情况:
1.未设置meta-data值,页面横屏状态
2.未设置meta-data值,页面竖屏状态,不显示状态栏
这2种情况都会出现后果二。如果你的app中页面没有这两种情况,例如都是竖屏且显示状态栏,你就可以淡定地不做处理。
现在我们知道原因了就可以对症下药了,这里给出我推荐的解决方案(官方给出的解决方案不止一种,可以根据自己的需要采用) 分为4步:
1.配置meta-data
①对Application生效,意味着该应用的所有页面,系统都不会做竖屏场景的特殊下移或者是横屏场景的右移特殊处理:
![22ea1fbef2e3fd9f89e402d5327f78e9.png](https://i-blog.csdnimg.cn/blog_migrate/c16e32a08517ffa9739777a6a1344a8a.jpeg)
配置在application下
② 对Activity生效,意味着可以针对单个页面进行刘海屏适配,设置了该属性的Activity系统将不会做特殊处理:
![2a70652ed75d49759b5a1da4c8fb706a.png](https://i-blog.csdnimg.cn/blog_migrate/a9a0eeb32ddefbbfb1bd5773c209077e.jpeg)
配置在Activity下
2.检测是否存在刘海屏
public static boolean hasNotchInScreen(Context context) { boolean ret = false; try { ClassLoader cl = context.getClassLoader(); Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil"); Method get = HwNotchSizeUtil.getMethod("hasNotchInScreen"); ret = (boolean) get.invoke(HwNotchSizeUtil); } catch (ClassNotFoundException e) { Log.e("test