转载请标明出处:
https://blog.csdn.net/DJY1992/article/details/80689308
本文出自:【奥特曼超人的博客】
推荐:
- android 兼容所有刘海屏的方案大全
- android 兼容huawei手机刘海屏解决方案
- android 兼容vivo手机刘海屏解决方案
- android兼容oppo手机刘海屏解决方案
- android兼容小米xiaomi刘海屏解决方案
- android 关于google刘海屏的解决方案
- ios兼容iphonex刘海屏解决方案
目录:
刘海屏问题
首先需要使用模拟器测试,最近 Google 也发布了 Android P 的模拟器,也可以找些真机云测的平台,但是需要一点点费用,自己买一台也是可以的,毕竟都是安卓开发。
首先考虑的是如何兼容各大厂商的问题,首先归总下:
- 谷歌google
- 小米xiaomi
- 华为huawei
- vivo
- oppo
Google 解决方案Android P
首先需要把SDK更新到Android P preview版本,然后使用 Android P 提供的模拟器,在开发者选项里找到 “Simulate a display with a cutout”,开启刘海屏的支持,需要注意它们的区别,因为刘海屏是有多个版本的。
注意,尾部都是带有cutout的,很多人不知道为什么,后面会讲解。
有了模拟器,接下来就解决代码问题了:
Google官方提供了三种模式:
1.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
2.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
3.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
官方对应的解释:
- 仅仅当系统提供的bar完全包含了刘海区时才允许window扩展到刘海区,否则window不会和刘海区重叠
- 允许window扩展到刘海区
- 不允许window扩展到刘海区
老码农看到LAYOUT的时候应该可以想到它应该是属于哪里的了,没错,就是属于WindowManager
的,老家伙出场,WindowManager
的类型:WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
。
WindowManager.LayoutParams windowManagerDu = getWindow().getAttributes();
windowManagerDu.layoutInDisplayCutoutMode=WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
getWindow().setAttributes(windowManagerDu );
之前很多人问为什么开发者模式都是cutout,其实就是cut的边缘体,也就是layoutInDisplayCutoutMode
,如果带状态栏的话需要判断DisplayCutout
。
DisplayCutout cutoutMode = getDisplayCutout();
if(cutoutMode != null){
WindowManager.LayoutParams windowManagerDu = getWindow().getAttributes();
windowManagerDu.layoutInDisplayCutoutMode=WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
getWindow().setAttributes(windowManagerDu );
}
这样就设置了是否允许window扩展到刘海区的代码,厂商的兼容度都是不一样的,因为都是在谷歌出解决方案之前出的刘海屏,所以版本上的兼容要统一估计也没那么快。
其它厂商解决方案
小米官方提供的解决方案
目前已上市的小米 Notch 设备(俗称刘海屏手机):小米8、小米8 SE、小米8 透明探索版
由于内容较多,详细请见另外篇:android兼容小米xiaomi刘海屏解决方案
华为官方提供的解决方案
由于内容较多,详细请见另外篇:android 兼容huawei手机刘海屏解决方案
vivo官方提供的解决方案
由于内容较多,详细请见另外篇:android 兼容vivo手机刘海屏解决方案
oppo官方提供的解决方案
由于内容较多,详细请见另外篇:android兼容oppo手机刘海屏解决方案
其它手机厂商
暂时没有发现,欢迎同学们多多投稿,也可加Q群投稿。