我将适配方案整理后,封装成了一个库并上传至github,可参考使用
项目地址:https://github.com/smarxpan/NotchScreenTool
作者:聪明叉
链接:https://www.jianshu.com/p/2b8db60ba8df
市面上的屏幕尺寸和全面屏方案五花八门。
这里我使用了小米的图来说明:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MV6cWK20-1623503473678)(//upload-images.jianshu.io/upload_images/1310103-0091c5f2f78b42cc.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]
上述两种屏幕都可以统称为刘海屏,不过对于右侧较小的刘海,业界一般称为水滴屏或美人尖。为便于说明,后文提到的「刘海屏」「刘海区」都同时指代上图两种屏幕。
当我们在谈屏幕适配时,我们在谈什么
- 适应更长的屏幕
- 防止内容被刘海遮挡
其中第一点是所有应用都需要适配的,对应下文的声明最大长宽比
而第二点,如果应用本身不需要全屏显示或使用沉浸式状态栏,是不需要适配的。
针对需要适配第二点的应用,需要获取刘海的位置和宽高,然后将显示内容避开即可。
声明最大长宽比
以前的普通屏长宽比为16:9,全面屏手机的屏幕长宽比增大了很多,如果不适配的话就会类似下面这样:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pcUwFyLP-1623503473681)(//upload-images.jianshu.io/upload_images/1310103-395cc706dc083314.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/170/format/webp)]
黑色区域为未利用的区域。
适配方式
适配方式有两种:
-
将targetSdkVersion版本设置到API 24及以上
这个操作将会为
<application>
标签隐式添加一个属性,android:resizeableActivity="true"
, 该属性的作用后面将详细说明。 -
在
<application>
标签中增加属性:android:resizeableActivity="false"
同时在节点下增加一个
meta-data
标签:<!-- Render on full screen up to screen aspect ratio of 2.4 --> <!-- Use a letterbox on screens larger than 2.4 --> <meta-data android:name="android.max_aspect" android:value="2.4" />
原理说明
这里涉及到的知识点是android:resizeableActivity属性。
在 Android 7.0(API 级别 24)或更高版本的应用,android:resizeableActivity属性默认为true(对应适配方式1)。这个属性是控制多窗口显示的,决定当前的应用或者Activity是否支持多窗口。
在清单的<activity>
或 <application>
节点中设置该属性,启用或禁用多窗口显示:
android:resizeableActivity=["true" | "false"]
如果该属性设置为 true,Activity 将能以分屏和自由形状模式启动。 如果此属性设置为 false,Activity 将不支持多窗口模式。 如果该值为 false,且用户尝试在多窗口模式下启动 Activity,该 Activity 将全屏显示。
适配方式2即为设置屏幕的最大长宽比,这是官方提供的设置方式。
如果设置了最大长宽比,必须android:resizeableActivity="false"
。 否则最大长宽比没有任何作用。
适配刘海屏
Android9.0及以上适配
Android P(9.0)开始,官方提供了适配异形屏的方式。