全面屏适配指南

联想推出多款深受用户喜爱的全面屏手机产品。为了让开发者应用更好适配全面屏,给用户带来更好的体验。这里为开发者提供一些全面屏适配的建议。

一、    全面屏介绍:

更大的屏幕,屏幕长宽比例超过1.86以上,部分全面屏手机顶部有凹槽。

二、    设备信息

微信图片_20181115102722

model

分辨率

Notch高度

Notch宽度

DPI

lenovo Z5

1080×2246

360px

90px

480

lenovo S5 pro

1080×2246

90px

540px

480

moto P30

1080×2246

90px

540px

480

lenovo Z5 pro

1080×2340

480

 

三、    适配建议

 【界面UI布局建议】

1、 充分利用全面屏显示更多内容

  • 开发者可充分利用全面屏显示更多内容

2、 避免内容拉伸/变形

  •  从16:9变成18:9甚至更长的比例,图片往往被会拉伸变形,此问题常见于应用开屏图。建议使用更灵活的布局,以适应不同的屏幕比例。

3、 针对刘海屏适配

  • 建议内容避开凹槽,由背景填充。注意内容无论横屏或竖屏显示都不会被屏幕凹形槽遮蔽

22

 

3

4、 针对状态栏和虚拟导航键

避免状态栏部分显示应用具体内容,导致遮挡影响体验

特别说明:尤其需考虑旋转情况

4

【技术方案建议】

 1、声明 Maximum Aspect Ratio

Android 标准接口中,支持应用声明其支持的最大屏幕高宽比(maximum aspect ratio)。具体声明如下,其中的 ratio_float 被定义为是高除以宽,以 16:9 为例,ratio_float = 16/9 = 1.778 (18:9则为2.0)。

建议开发者声明 Maximum Aspect Ratio ≥ 2.2 或更多。

如果应用的 android:resizeableActivity 已经设置为 true,就不必设置 Maximum Aspect Ratio 了。

详细可参阅Android 官方文档 >>>

2、升级至安卓O以上版本

安卓修改AndroidManifest.xml文件,设置targetSdkVersion>=26,就是应用升级到O版本,不需要设置其他任何属性,默认在任何纵横比的屏幕都能全屏显示

 3、应用适配刘海屏布局说明

刘海有关的硬件参数,如有无刘海、刘海的宽度和高度等,

都是定义了在了framework/base/res/res/values/config.xml,而且是内部资源。

三方应用适配刘海,需要采用反射机制获取刘海参数,以下是刘海的参数说明:

 

config_screen_has_notch: 变量类型:bool, 用于判断是否支持刘海;

notch_w: 变量类型:integer, 用于获取刘海的宽度(单位是像素);

notch_h: 变量类型:integer, 用于获取刘海的高度(单位是像素);

notch_x:变量类型:integer, 用于获取刘海区域左侧边缘的x坐标(单位是像素);

notch_y:变量类型:integer, 用于获取刘海区域上侧边缘的y坐标(单位是像素);

 

对于目前联想Z5参数配置如下:

<bool name=”config_screen_has_notch”>true</bool>

<integer name=”notch_x”>360</integer>

<integer name=”notch_y”>0</integer>

<integer name=”notch_w”>360</integer>

<integer name=”notch_h”>90</integer>

针对安卓P,应用适配刘海屏方法: 

需要在界面窗口配置属性 ,说明如下, 可以参考WindowManager.java(framework/base/core/java/android/view)
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT:默认情况下,全屏窗口不会使用到刘海区域,非全屏窗口可正常使用刘海区域
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER:窗口不允许和刘海屏重叠
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES:窗口需要扩展到刘海区域
例子如下:
class MyActivity {
void onCreate() {
// ?
view.setSystemUiVisibility(
SYSTEM_UI_FLAG_FULLSCREEN);
lp = getWindow.getAttributes();
lp.layoutInDisplayCutoutMode =
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
getWindow().setAttributes(lp);
// ?
}
Android P关于刘海参数有如下接口开放,如需要可以调用使用:
方法接口说明:可以参考DisplayCutout类中定义。 注意:以下接口都是要Build.VERSION.SDK_INT >= 28才能调用到
getBoundingRects() 返回Rects的列表,每个Rects都是显示屏上非功能区域的边界矩形。
getSafeInsetLeft () 返回安全区域距离屏幕左边的距离,单位是px。
getSafeInsetRight () 返回安全区域距离屏幕右边的距离,单位是px。
getSafeInsetTop () 返回安全区域距离屏幕顶部的距离,单位是px。//jd2019, rio, jd2018-p用此接口
getSafeInsetBottom() 返回安全区域距离屏幕底部的距离,单位是px。

详细建议可参考谷歌官方说明