免费试用

中文化、本土化、云端化的在线跨平台软件开发工具,支持APP、电脑端、小程序、IOS免签等等

android 开发displaycutout

在 Android 9.0 及以上版本中,谷歌推出了 DisplayCutout API,这个 API 是为了适配全面屏手机而生的。DisplayCutout API 可以让开发者获取到屏幕中的刘海(或水滴屏)信息,以便于在应用中进行相应的适配。下面我们来详细介绍一下 DisplayCutout API 的原理和使用方法。

一、原理

在全面屏手机上,由于屏幕顶部或者底部有刘海或者水滴屏等特殊形状,因此需要在应用中进行适配。在 Android 9.0 及以上版本中,谷歌推出了 DisplayCutout API,这个 API 可以让开发者获取到屏幕中的刘海信息,以便于在应用中进行相应的适配。

具体来说,DisplayCutout API 主要通过以下两种方式获取刘海信息:

1. 通过 WindowInsets#getDisplayCutout() 方法获取 DisplayCutout 对象,该对象包含了刘海的位置和大小信息。getDisplayCutout() 方法返回的 DisplayCutout 对象可能为 null,表示当前屏幕不存在刘海或者水滴屏等特殊形状。

2. 通过 WindowInsets#getSystemWindowInsetTop() 方法获取状态栏的高度,该高度包含了刘海的高度。如果状态栏的高度大于 0,则说明当前屏幕存在刘海或者水滴屏等特殊形状。

二、使用方法

下面我们来介绍一下如何使用 DisplayCutout API 来适配全面屏手机。

1. 获取 DisplayCutout 对象

我们可以通过 WindowInsets#getDisplayCutout() 方法获取 DisplayCutout 对象,该对象包含了刘海的位置和大小信息。如果当前屏幕不存在刘海或者水滴屏等特殊形状,则 getDisplayCutout() 方法会返回 null。

下面是一个简单的示例代码:

```

View rootView = getWindow().getDecorView().getRootView();

rootView.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {

@Override

public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets) {

DisplayCutout displayCutout = windowInsets.getDisplayCutout();

if (displayCutout != null) {

// 处理刘海信息

}

return windowInsets;

}

});

```

在这个示例代码中,我们通过 rootView 的 setOnApplyWindowInsetsListener() 方法来监听 WindowInsets 的变化。当 WindowInsets 发生变化时,我们可以通过 getDisplayCutout() 方法获取 DisplayCutout 对象,从而获取刘海的位置和大小信息。

2. 处理刘海信息

获取到 DisplayCutout 对象后,我们可以通过以下方法获取刘海的位置和大小信息:

- getSafeInsetTop():获取刘海顶部安全区域的高度。

- getSafeInsetBottom():获取刘海底部安全区域的高度。

- getSafeInsetLeft():获取刘海左侧安全区域的宽度。

- getSafeInsetRight():获取刘海右侧安全区域的宽度。

下面是一个简单的示例代码:

```

View rootView = getWindow().getDecorView().getRootView();

rootView.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {

@Override

public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets) {

DisplayCutout displayCutout = windowInsets.getDisplayCutout();

if (displayCutout != null) {

int safeInsetTop = displayCutout.getSafeInsetTop();

int safeInsetBottom = displayCutout.getSafeInsetBottom();

int safeInsetLeft = displayCutout.getSafeInsetLeft();

int safeInsetRight = displayCutout.getSafeInsetRight();

// 处理刘海信息

}

return windowInsets;

}

});

```

在这个示例代码中,我们通过 getSafeInsetTop()、getSafeInsetBottom()、getSafeInsetLeft() 和 getSafeInsetRight() 方法来获取刘海的位置和大小信息。

3. 适配布局

获取到刘海的位置和大小信息后,我们可以通过以下方式来适配布局:

- Padding 方式:在布局中添加 padding,以避免内容被刘海覆盖。

- Margin 方式:在布局中添加 margin,以避免内容与刘海重叠。

- 剪裁方式:可以通过 setClipToPadding() 方法或者 setClipChildren() 方法来剪裁布局,以避免内容被刘海覆盖。

下面是一个简单的示例代码:

```

View rootView = getWindow().getDecorView().getRootView();

rootView.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {

@Override

public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets) {

DisplayCutout displayCutout = windowInsets.getDisplayCutout();

if (displayCutout != null) {

int safeInsetTop = displayCutout.getSafeInsetTop();

int safeInsetBottom = displayCutout.getSafeInsetBottom();

int safeInsetLeft = displayCutout.getSafeInsetLeft();

int safeInsetRight = displayCutout.getSafeInsetRight();

// 适配布局

view.setPadding(safeInsetLeft, safeInsetTop, safeInsetRight, safeInsetBottom);

}

return windowInsets;

}

});

```

在这个示例代码中,我们通过 setPadding() 方法来给 rootView 添加 padding,以避免内容被刘海覆盖。

总结

DisplayCutout API 是为了适配全面屏手机而生的,通过该 API,开发者可以获取到屏幕中的刘海信息,以便于在应用中进行相应的适配。在使用 DisplayCutout API 时,我们需要注意以下几点:

- 通过 WindowInsets#getDisplayCutout() 方法获取 DisplayCutout 对象,该对象包含了刘海的位置和大小信息。getDisplayCutout() 方法返回的 DisplayCutout 对象可能为 null,表示当前屏幕不存在刘海或者水滴屏等特殊形状。

- 通过 DisplayCutout#getSafeInsetTop()、getSafeInsetBottom()、getSafeInsetLeft() 和 getSafeInsetRight() 方法来获取刘海的位置和大小信息。

- 可以通过 Padding 方式、Margin 方式或者剪裁方式来适配布局,以避免内容被刘海覆盖。


相关知识:
安卓开发vue
Vue.js是一个流行的JavaScript框架,用于构建交互式Web界面。它采用了MVVM模式,是一种轻量级的框架,易于学习和使用。Vue.js可以与其他库和框架无缝集成,因此在开发移动应用程序时,Vue.js也可以与Android平台一起使用。Vue.
2023-04-06
ipa文件打包
IPA文件是iOS应用程序的安装包,它包含了应用程序的二进制代码、资源文件和其他必要的信息,可以通过iTunes或者其他的iOS应用商店进行安装。在iOS开发中,IPA文件打包是非常重要的一个环节,下面我们来详细介绍一下IPA文件打包的原理和步骤。一、IP
2023-04-06
手机App
手机App(Application)是指在移动设备上安装的应用程序,它们可以通过各种应用商店下载,并在移动设备上运行。随着移动设备的普及,手机App已经成为人们日常生活中不可或缺的一部分。本文将从原理和详细介绍两个方面来介绍手机App。一、原理手机App的
2023-04-06
网页转换成app
将网页转换成应用程序(App)是一种非常流行的方式,可以让网站更加易于访问和使用。这种技术通常被称为“混合应用程序”,因为它结合了网页和应用程序的特点。在本文中,我们将详细介绍如何将网页转换成应用程序,包括原理和实现方法。一、原理将网页转换成应用程序的原理
2023-04-06
ipa包加弹窗
在iOS开发中,ipa包是一种应用程序包,包含了应用程序的二进制文件、资源文件和元数据等。有时候我们需要在应用程序中加入弹窗功能,用于提示用户一些信息或者进行一些操作。本文将介绍在ipa包中加入弹窗的原理和具体实现方法。一、原理在iOS开发中,弹窗通常是通
2023-04-06
apk文件结构
APK是Android应用程序的标准安装包格式,在Android设备上通过安装APK文件来安装应用程序。APK文件实际上是一个压缩文件,其中包含了应用程序的所有组件和资源,包括Java代码、XML文件、图像、音频、视频等。在本文中,我们将详细介绍APK文件
2023-04-06
android vue混合开发
Android和Vue.js是两个非常流行的技术栈,它们可以结合起来进行混合开发。在这篇文章中,我们将介绍如何将Android和Vue.js结合起来进行混合开发。首先,我们需要了解一些基本概念。Vue.js是一个流行的JavaScript框架,用于构建用户
2023-04-06
android 打包配置
Android 打包配置是指将 Android 应用程序打包成 APK 文件的过程。在打包配置过程中,需要进行一系列的设置和调整,以确保应用程序能够正确地运行。本文将详细介绍 Android 打包配置的原理和步骤。1. 原理在 Android 应用程序的开
2023-04-06
手机制作apk共存
APK共存是指在同一台手机上安装两个或多个相同的应用程序,这种情况通常出现在需要使用不同账号登录同一应用的情况下。例如,在同一台手机上使用两个不同的微信账号登录,或者在同一台手机上使用两个不同的支付宝账号进行支付等等。下面我们来详细介绍手机制作APK共存的
2023-04-06
数据打包apk
在移动应用开发中,为了方便用户下载和安装应用程序,通常需要将应用程序打包成APK(Android Package Kit)文件。APK文件是一种Android应用程序的压缩文件,它包含了应用程序的代码、资源文件、配置文件等内容。本文将介绍数据打包APK的原
2023-04-06
jar生成apk
在Android开发中,我们经常会使用到jar包,它是一种Java的打包格式,可以将多个Java类打包成一个文件,方便在其他项目中引用。而在Android应用开发中,我们通常会将Java代码编译成.dex文件,然后打包成apk文件。但是有时候我们也需要将一
2023-04-06
网页打包APP增加微信原生支付功能
使用一门APP给网页打包APP增加微信原生支付功能首先在【开发者中心】-【离线配置功能】-【微信支付】如图,点击问题或者图标,弹出微信支付配置页面弹窗!按照提示把微信支付各个支付要素的ID和key依次正确填写,之后点击保存!之后重新打包APP!下载新版AP
2017-04-25