当前位置: 首页 > 科技观察

一波安卓刘海屏来袭,全网适配技能全面!

时间:2023-03-17 19:15:28 科技观察

1。前言大家好,我是呈祥墨影!苹果一直引领着设计潮流,自iPhoneX发布以来,“刘海屏”就一直饱受争议。但不管怎么说,Android也应该加入“刘海屏”的行列,尤其是AndroidP发布之后,更是从系统层面支持了刘海屏设计。不少厂商也陆续推出了“刘海屏”设计的手机。国内比较常见的是OPPOx21和华为P20。屏幕不一样,就迎来了一些适配问题,今天就来说说安卓的“刘海屏”,我们该如何适配。二、刘海平背景介绍2.1刘海平外貌背景介绍。我想大家应该都有一个想法,但是不同厂家的刘海屏实现方式也是不一样的。这首先需要一个概念。就目前市场情况来看,会分为两类,一类是标准的AndroidPApi,一类是厂商针对AndroidP以下系统做的特殊适配。例如:华为P20使用AndroidP标准的Api方法,但是OPPOx21不同,它有自己的适配Api。2.2需要单独适配的即使加上刘海屏,你也可以发现大部分都是“切”的状态栏区域,所以你面临三种情况。带有状态栏的页面不会受到刘海屏的影响。如果全面屏不适配刘海屏,系统会将刘海区域切掉,使整个UI页面下移,避免刘海显示。全面屏已经适配了刘海屏,可以兼容刘海屏,实现真正的全面屏显示。这几种方法的区别后面会单独说明。2.3抢先体验AndroidP当手头没有系统对应的设备时,模拟器是个不错的方式。近日,谷歌也发布了一款AndroidP模拟器。还有一个办法就是找一些支持真机云测试的平台,租一个需要的远程设备,也是一种解决方法。我这里选择AndroidP模拟器。如果需要自己更新SDK,直接下载更新就可以了。刘海的凹槽区域多半是为了给摄像头或者其他传感器留出区域。在没有刘海屏的设备或模拟器上,您可以通过开发者选项中的“用刘海屏模拟显示器”来启用刘海屏支持。如果你尝试了所有的模式,你会发现刘海屏的刘海在AndroidP上其实是有多种风格的,而且并不统一。2.4刘海屏的适配2.2也明确了刘海屏的裁剪区域存在于状态栏上,所以在有状态栏的页面上,我们不需要特殊处理,系统会帮我们处理.对于全屏页面,需要单独处理。在这里,我简单做了一个全屏页面,每个横条的宽度都相等,这样你就可以看出布局的不同。从左到右分别是:关闭刘海屏、开启刘海屏但不支持、改编刘海屏。一个全屏的页面,当不支持刘海,触及刘海时,会导致UI下沉。如果这不是列表布局,底部的控件将被阻止。比如下面这种情况:图片来自:华为适配指南被刘海遮挡的区域还是有一些效果。其实主要还是靠UI设计者来规避。不要设计可能剪刘海的可操作区域,影响用户操作。3、技术适配刘海平说了那么多,最后还是要用技术来适配刘海平。AndroidP的notch有标准的适配API,但对于一些厂商自己的notch设备,比如OPPOx21,需要按照其开发文档进行个性化适配。AndroidP提供了一个特殊的API来支持最新的刘海屏:DisplayCutout。3.1开启刘海屏我们在全面屏页面,需要单独开启刘海屏支持。在谷歌提供的适配方案中,可以设置是否在全屏模式下使用刘海区域。WindowManager.LayoutParamslp=getWindow().getAttributes();lp.layoutInDisplayCutoutMode=WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;getWindow().setAttributes(lp);新的布局属性layoutInDisplayCutoutMode包含三种可选的模式,publicstaticfinalintLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS=1;publicstaticfinalintLAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT=0;publicstaticfinalintLAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER=2;3.2刘海高度在全屏模式下,我们需要一种方法来获取刘海的高度,以便在设计和布局时保持安全距离。虽然谷歌要求刘海的凹槽必须与刘海的高度一致,而刘海隐藏在状态栏中,所以一种思路是直接获取状态栏的高度来判断刘海安全的布局区域。不过AndroidP保留了一个标准的凹槽测量Api:DisplayCutout。刘海屏的凹槽在屏幕中间,所以只有getSafeInsetTop()方法返回的结果是我们需要的,其他getSafeInsetXxx()方法直接返回0。view.postDelayed(newRunnable(){@Overridepublicvoidrun(){DisplayCutoutdisplayCutout=view.getRootWindowInsets().getDisplayCutout();Log.i("cxmyDev","SafeInsetBottom:"+displayCutout.getSafeInsetBottom());Log.i("cxmyDev","SafeInsetLeft:"+displayCutout.getSafeInsetLeft());Log.i("cxmyDev","SafeInsetRight:"+displayCutout.getSafeInsetRight());Log.i("cxmyDev","SafeInsetTop:"+displayCutout.getSafeInsetTop());}},100);也可以看看结果:I/cxmyDev:SafeInsetBottom:0I/cxmyDev:SafeInsetLeft:0I/cxmyDev:SafeInsetRight:0I/cxmyDev:SafeInsetTop:1123.3像OPPO这样的非标准Api对于此类厂商,刘海屏的实现方式是不基于AndroidP标准。完全修改了刘海屏的实现。不过好在他们会提供完整的适配文档,这就需要我们直接阅读他们提供的开发文档进行适配。oppo的刘海适配文档:https://open.oppomobile.com/wiki/doc#id=10139对于OPPO来说,刘海的高度是固定的,就是80px。判断当前设备是否为刘海屏,也提供了相应的API,可以通过以下方法获取。context.getPackageManager().hasSystemFeature(“com.oppo.feature.screen.heteromorphism”)对刘海屏返回true,但该方法只能识别OPPO品牌支持的刘海屏。4.结语看完本文,相信你对Android刘海屏有了一定的了解。这是一项全新的适配技术,不确定不同厂商是否会对其进行微调,所以如果大家遇到什么问题,不妨在留言区留言讨论。【本文为专栏作家“张扬”原创稿件,转载请微信♂联系作者获得授权】点此查看作者更多好文