Android 9 新增了对在设备上实现不同类型刘海屏的支持。通过刘海屏,您可以打造沉浸式全面屏体验,同时继续在设备前端为重要传感器留出空间。

图 1. 顶部中间刘海屏

Android 9 支持以下类型的刘海屏:

顶部中间刘海屏:刘海屏位于顶部边缘的中间位置

顶部非中间刘海屏:刘海屏位于边角处或稍微偏离中心的位置

底部刘海屏:刘海屏位于底部

双刘海屏:一个刘海屏位于顶部,一个位于底部

示例和源代码

以下窗口管理器代码 (PhoneWindowManager.java) 显示了如何在未设置 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS 的情况下将显示帧嵌入安全区域。

// Ensure that windows with a DEFAULT or NEVER display cutout mode are laid out in

// the cutout safe zone.

if (cutoutMode != LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS) {

final Rect displayCutoutSafeExceptMaybeBars = mTmpDisplayCutoutSafeExceptMaybeBarsRect;

displayCutoutSafeExceptMaybeBars.set(displayFrames.mDisplayCutoutSafe);

if (layoutInScreen && layoutInsetDecor && !requestedFullscreen

&& cutoutMode == LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT) {

// At the top we have the status bar, so apps that are

// LAYOUT_IN_SCREEN | LAYOUT_INSET_DECOR but not FULLSCREEN

// already expect that there's an inset there and we don't need to exclude

// the window from that area.

displayCutoutSafeExceptMaybeBars.top = Integer.MIN_VALUE;

}

if (layoutInScreen && layoutInsetDecor && !requestedHideNavigation

&& cutoutMode == LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT) {

// Same for the navigation bar.

switch (mNavigationBarPosition) {

case NAV_BAR_BOTTOM:

displayCutoutSafeExceptMaybeBars.bottom = Integer.MAX_VALUE;

break;

case NAV_BAR_RIGHT:

displayCutoutSafeExceptMaybeBars.right = Integer.MAX_VALUE;

break;

case NAV_BAR_LEFT:

displayCutoutSafeExceptMaybeBars.left = Integer.MIN_VALUE;

break;

}

}

if (type == TYPE_INPUT_METHOD && mNavigationBarPosition == NAV_BAR_BOTTOM) {

// The IME can always extend under the bottom cutout if the navbar is there.

displayCutoutSafeExceptMaybeBars.bottom = Integer.MAX_VALUE;

}

// Windows that are attached to a parent and laid out in said parent already avoid

// the cutout according to that parent and don't need to be further constrained.

// Floating IN_SCREEN windows get what they ask for and lay out in the full screen.

// They will later be cropped or shifted using the displayFrame in WindowState,

// which prevents overlap with the DisplayCutout.

if (!attachedInParent && !floatingInScreenWindow) {

mTmpRect.set(pf);

pf.intersectUnchecked(displayCutoutSafeExceptMaybeBars);

parentFrameWasClippedByDisplayCutout |= !mTmpRect.equals(pf);

}

// Make sure that NO_LIMITS windows clipped to the display don't extend under the

// cutout.

df.intersectUnchecked(displayCutoutSafeExceptMaybeBars);

}

SystemUI 在刘海屏区域呈现,且需要确定可以绘制的位置。

PhoneStatusBarView.java 提供了一个视图示例,它确定了刘海屏的位置、刘海屏大小,以及从导航栏嵌入是否可以避开刘海屏区域。

通过覆盖 onApplyWindowInsets()onApplyWindowInsets(),视图可以确定刘海屏的位置,并相应地更新其布局。

@Override

public WindowInsets onApplyWindowInsets(WindowInsets insets) {

if (updateOrientationAndCutout(mLastOrientation)) {

updateLayoutForCutout();

requestLayout();

}

return super.onApplyWindowInsets(insets);

}

这些方法概述了各种类型的刘海屏(即顶部中间刘海屏、顶部非中间刘海屏、底部刘海屏和双刘海屏)在状态栏中的处理方式。

要求

要确保刘海屏不会对应用造成负面影响,您必须确保:

在竖屏模式下,状态栏的高度至少与刘海屏的高度持平

在全屏模式和横屏模式下,刘海屏区域必须显示遮幅式黑边

您的设备最多可以在每个短边处(顶部和底部)各设一个刘海屏。

如需了解详情,请参阅 CDD。

注意:对于面向 Android 8.0 或更低版本的应用,您可以为用户提供一个可使全屏或横屏应用延伸至刘海屏区域的选项(例如导航栏中的切换开关)。由于这样做可能会导致内容被切断,因此 layoutInDisplayCutoutModelayoutInDisplayCutoutMode 活动主题属性已反向移植到 Android 8.1,以允许应用选择停用该选项。如果您设置了该属性,则可能无法显示特殊的模式切换开关。

实现

要在设备上实现刘海屏,您必须为系统界面配置以下值。

说明

quick_qs_offset_height

定义“快捷设置”面板的上外边距。时钟和电池图标显示在该面板上方的空间。

在 values-land 中,设置为 status_bar_height_landscape,在纵屏中,将此值设置为默认值 48dp 或刘海屏高度(以较大者为准)。可以根据需要选择高于刘海屏的高度。

quick_qs_total_height

展开通知栏时,“超快设置”面板(收起的“快捷设置”面板)的总高度(其中包括包含时钟图标的面板上方的空间)。

由于快捷设置的布局方式,“超快设置”面板(包括偏移量)的总高度必须是静态已知的,因此该值必须使用相同的增量

quick_qs_offset_height。在 Values-land 中,此值默认为 152dp,在纵屏模式下,此值默认为 176dp。

status_bar_height_portrait

从框架的角度而言,状态栏的默认高度。

在大多数设备上,此值默认为 24dp。如果设备上有刘海屏,则将此值设置为刘海屏的高度。可以根据需要选择高于刘海屏的高度。

status_bar_height_landscape

状态栏在横屏模式下的高度。由于仅支持在设备的短边上显示刘海屏,因此此值始终是未经更改的状态栏高度。

在没有刘海屏的设备上,此值等同于 status_bar_height_portrait。如果设备上有刘海屏,则将此值保留为默认的状态栏高度。

config_mainBuiltInDisplayCutout

用于定义刘海屏形状的路径。这是可由 android.util.PathParser 解析的字符串,这也是系统如何定义刘海的大小和形状。

可在路径中指定 @dp@dp 以便模拟针对不同设备的形状。由于实际的刘海屏具有精确的像素尺寸,因此在定义硬件刘海屏的路径时,请勿使用 @dp@dp 指定符。

config_fillMainBuiltinDisplayCutout

一个确定是否在软件中绘制刘海屏路径(在上文中进行了定义)的布尔值。可用于模拟刘海屏,或填充实际刘海屏,以实现抗锯齿。

如果为 true,则系统会以黑色填充 config_mainBuiltInDisplayCutout。

如需了解默认定义,请参阅以下 dimens 文件:

模拟刘海屏的示例叠加层:

M 0,0

L -48, 0

L -44.3940446283, 36.0595537175

C -43.5582133885, 44.4178661152 -39.6, 48.0 -31.2, 48.0

L 31.2, 48.0

C 39.6, 48.0 43.5582133885, 44.4178661152 44.3940446283, 36.0595537175

L 48, 0

Z

@dp

true

48dp

28dp

48dp

176dp

验证

android9模拟刘海屏,刘海屏  |  Android 开源项目  |  Android Open Source Project相关推荐

  1. android10分区镜像,分区和映像  |  Android 开源项目  |  Android Open Source Project

    分区 Android 设备包含若干个分区,这些分区在启动过程中发挥不同的作用.为了支持 A/B 更新,设备需要为 boot.system.vendor 和 radio 分区分别单独配置一个槽位. bo ...

  2. android的wifi直连,WLAN 直连  |  Android 开源项目  |  Android Open Source Project

    WLAN 直连功能又称"WLAN 点对点",它允许支持设备直接使用 WLAN 直连协议发现其他设备并与之互连(无需连接到互联网或移动网络).此功能是基于 Wi-Fi 联盟 (WFA ...

  3. android hal 音频分析,实现车载音频 HAL  |  Android 开源项目  |  Android Open Source Project...

    车载音频实现依赖标准 Android 音频 HAL,其中包括以下内容: IDevice (hardware/interfaces/audio/2.0/IDevice.hal).负责创建输入流和输出流. ...

  4. android tee,Trusty TEE  |  Android 开源项目  |  Android Open Source Project

    Trusty 是一种安全的操作系统 (OS),可为 Android 提供可信执行环境 (TEE).Trusty 操作系统与 Android 操作系统在同一处理器上运行,但 Trusty 通过硬件和软件 ...

  5. android系统tee接口,Trusty TEE  |  Android 开源项目  |  Android Open Source Project

    Trusty 是一种安全的操作系统 (OS),可为 Android 提供可信执行环境 (TEE).Trusty 操作系统与 Android 操作系统在同一处理器上运行,但 Trusty 通过硬件和软件 ...

  6. android系统的测试方法,运行测试  |  Android 开源项目  |  Android Open Source Project...

    本页将介绍如何在 Linux 和 Windows 环境中运行 deqp 测试.如何使用命令行参数,以及如何使用 Android 应用包. Linux 与 Windows 环境 首先,请将以下文件及目录 ...

  7. 安卓linux输入代码在哪里,输入  |  Android 开源项目  |  Android Open Source Project

    Android 输入子系统名义上由遍历系统多个层的事件管道组成. 输入管道 在最低层,物理输入设备会生成描述状态更改(例如按键按压和轻触接触点)的信号.设备固件以某种方式编码和传输这些信号,例如向系统 ...

  8. android afw测试,测试设备配置  |  Android 开源项目  |  Android Open Source Project

    Android Enterprise (AE) 自动化测试框架是一个用于验证 Android 设备的企业级兼容性的测试套件.该套件包括配套应用.测试用例.配置文件和一个基于 cts-tradefed ...

  9. android开机自动开启zram,低内存配置  |  Android 开源项目  |  Android Open Source Project...

    Android 支持内存为 512 MB 的设备.本文档旨在帮助 OEM 优化和配置 Android 内核 4.4,使其能够在低内存设备上运行.在下文所述的优化措施中,有几项非常通用,甚至也可应用于以 ...

最新文章

  1. 凶猛的飞禽 超跑奥迪
  2. androidstudio返回之前界面_charles 如何修改服务器返回内容 - Breakpoints
  3. 从零写一个编译器(五):语法分析之自动机的缺陷和改进
  4. 静态路由心法口诀:路由表少什么网络加什么网络
  5. Facebook 开源首个全卷积语音识别工具包 wav2letter++
  6. 全网最简单的k8s User JWT token管理器
  7. cif t t操作流程图_Danish:STATA 操作正态检验、卡方检验和T检验
  8. 员工请假审批系统 php,php073企业考勤请假系统
  9. MATLAB的矩阵输入
  10. 如何辨别3C标志的真伪!
  11. GetDc与GetWindowDc的含义
  12. U3D中的常用字符串加密算法程序
  13. Excel VBA合并不同工作簿所有工作表到一张工作表
  14. 高精密应变片0.01g信号采集方案分享
  15. 计算网络之云运维发展历史
  16. python编程做联机游戏大全单机_如何将一款单机双人的游戏做成联机版?
  17. CANoe.DiVa 操作指南 - 时间参数配置
  18. ccc-数据科学库(HM)-day2
  19. python网络爬虫 百度网盘_百度网盘爬虫(如何爬取百度网盘)
  20. 树莓派系统、硬件更新

热门文章

  1. ubuntu系统安装TIM,QQ,微信,迅雷,百度网盘
  2. html5是什么意思,html5是什么意思?
  3. 使用jquery的bind来检测textarea,input等的文本变化
  4. android利用EpMedia给录像添加时间水印
  5. 基于京东micro-app微前端框架的项目实践
  6. UEFI——UEFI Package Module
  7. 利用计算机求解一个实际问题的步骤是,数学在计算机科学的应用.doc
  8. [Win10+Excel365]尽管已启用VBA宏,Excel还是无法运行宏
  9. 无法识别的usb设备 跟这台计算机,无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别...
  10. W ndows 10模拟器,手机windows10模拟器下载_手机windows10模拟器安卓版下载中文 v0.20.0.3b-66街机网...