为了账号安全,请及时绑定邮箱和手机立即绑定

最详细的Android P版本刘海屏适配指南来了

标签:
Android

摘要: Android P预览版增加了很多亮点新特性,其中最接地气、最直观的改变当属适配了类似于华为P20的顶部凹槽屏幕设计这一项,俗称刘海屏。 在开发者模式中,Android P系统将调整通知栏的设计来适配此种屏幕,新的APIs也将允许开发者决定通知消息的展示形式。 随着各大手机厂商挤入“刘海屏”手机发布的潮流,Android P版本的此特性,能够让各大应用厂商充分利用独特的屏幕来进行应用设计。 那么如何让你的应用快速适配刘海屏呢?本文为你提供最详细的解读指南。

                                   

Android P预览版增加了很多亮点新特性,其中最接地气、最直观的改变当属适配了类似于华为P20的顶部凹槽屏幕设计这一项,俗称刘海屏。

在开发者模式中,Android P系统将调整通知栏的设计来适配此种屏幕,新的APIs也将允许开发者决定通知消息的展示形式。

随着各大手机厂商挤入“刘海屏”手机发布的潮流,Android P版本的此特性,能够让各大应用厂商充分利用独特的屏幕来进行应用设计。

那么如何让你的应用快速适配刘海屏呢?本文为你提供最详细的解读指南。

刘海屏适配“背景介绍”

1、Android P版本提供了统一的刘海屏方案和三方适配刘海屏方案:

  • 对于有状态栏的页面,不会受到刘海屏特性的影响;

  • 全屏显示的页面,系统刘海屏方案会对应用界面做下移处理,避开刘海区显示;

  • 已经适配Android P应用的全屏页面可以通过谷歌提供的适配方案使用刘海区,真正做到全屏显示。

image

2、P版本三方适配刘海屏方案:

  • 新增刘海屏凹槽尺寸和位置接口

class WindowInsets {DisplayCutout getDisplayCutout();

}class DisplayCutout {int getSafeInsetLeft();int getSafeInsetTop();int getSafeInsetRight();int getSafeInsetBottom();Region getBounds();

}
  • 新窗口布局模式,允许应用程序请求是否在刘海区域布局:

class WindowManager.LayoutParams {int layoutInDisplayCutoutMode;final intLAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;final intLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;final intLAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;

       }

layoutInDisplayCutoutMode值说明:

LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT:默认情况下,全屏窗口不会使用到刘海区域,非全屏窗口可正常使用刘海区域。

LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS:窗口声明使用刘海区域

LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER:窗口声明不使用刘海区域

兼容性影响

1、系统下移方案导致布局问题(截断、错乱,按钮热区错位);

image

小说页码被截断问题

2、状态栏高度写死问题;

image

状态栏背景高度写死问题

3、沉浸式布局遮挡问题;image

搜索框被遮挡问题

image

视频内容被遮挡问题

适配指导

1、在非刘海屏P版本手机可以开启模拟刘海屏调试的功能:

  • 在开发人员选项屏幕中,向下滚动到绘图部分,然后点击“模拟具有凹口的显示屏”设置项;

  • 选择刘海尺寸信息;

image

2、在刘海屏调试打开之后,浏览应用的所有页面,测试所有遮挡问题,或者是下移导致的问题,对有问题的页面进行布局适配。

适配方案:

  • 可以通过谷歌提供的适配方案,使用刘海区全屏显示解决:

WindowManager.LayoutParams lp =getWindow().getAttributes();  
lp.layoutInDisplayCutoutMode
=WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;  
getWindow().setAttributes(lp);
  • 布局调整,建议布局调整策略:

应用页面背景充满整个屏幕显示,控件和文字等关键信息布局在状态栏以外的区域,以保证关键信息不会出现遮挡(谷歌要求:凹槽高度和刘海高度要保持一致)。

需要用到的接口:

1)获取刘海尺寸信息接口

2)  获取系统状态栏高度接口:

public static intgetStatusBarHeight(Context context) {

   int result = 0;

   int resourceId
=context.getResources().getIdentifier("status_bar_height","dimen", "android");

   if (resourceId \> 0) {

       result = context.getResources().getDimensionPixelSize(resourceId);

    }

   return result;

}

需要注意的是:谷歌提供的刘海屏适配方案,要求应用必须适配到P版本才可使用。

作者:华为终端开放实验室

来源:https://my.oschina.net/u/3787471/blog/1788756

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消