【工作经验分享】Android刘海屏、水滴屏全面屏适配方案

我将适配方案整理后,封装成了一个库并上传至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)]

上述两种屏幕都可以统称为刘海屏,不过对于右侧较小的刘海,业界一般称为水滴屏或美人尖。为便于说明,后文提到的「刘海屏」「刘海区」都同时指代上图两种屏幕。

当我们在谈屏幕适配时,我们在谈什么

  1. 适应更长的屏幕
  2. 防止内容被刘海遮挡

其中第一点是所有应用都需要适配的,对应下文的声明最大长宽比

而第二点,如果应用本身不需要全屏显示或使用沉浸式状态栏,是不需要适配的。

针对需要适配第二点的应用,需要获取刘海的位置和宽高,然后将显示内容避开即可。

声明最大长宽比

以前的普通屏长宽比为16:9,全面屏手机的屏幕长宽比增大了很多,如果不适配的话就会类似下面这样:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pcUwFyLP-1623503473681)(//upload-images.jianshu.io/upload_images/1310103-395cc706dc083314.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/170/format/webp)]

黑色区域为未利用的区域。

适配方式

适配方式有两种:

  1. 将targetSdkVersion版本设置到API 24及以上

    这个操作将会为<application> 标签隐式添加一个属性,android:resizeableActivity="true", 该属性的作用后面将详细说明。

  2. <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)开始,官方提供了适配异形屏的方式。

Support display cutouts</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值