免费试用

中文化、本土化、云端化的在线跨平台软件开发工具,支持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 方式或者剪裁方式来适配布局,以避免内容被刘海覆盖。


相关知识:
html转apk
将HTML网页转化为APK(Android应用程序包)是一种非常流行的技术,它可以帮助开发人员将其网页转化为Android应用程序,从而使其更易于在移动设备上使用。本文将介绍如何将HTML网页转化为APK以及其原理。将HTML网页转化为APK的原理将HTM
2023-04-06
源码打包成app
将源代码打包成应用程序(APP)是一项技术,使开发人员能够将他们的代码转换为可在移动设备上运行的应用程序。在此过程中,开发人员需要将代码编译为可执行文件,并将其打包成一个安装包,以便用户可以将其下载并安装在他们的设备上。下面将详细介绍源码打包成APP的原理
2023-04-06
ios免签隐藏头部网址
在iOS中,我们经常需要安装一些第三方应用,但是由于iOS系统的限制,这些应用必须经过苹果官方的审核才能上架App Store。因此,一些开发者会选择通过“免签”方式来发布应用,即通过特定途径安装应用,而不需要通过App Store下载。不过,在使用免签方
2023-04-06
云打包
云打包是一种将应用程序、文件和其它资源打包成一个可执行文件并上传到云服务器上,然后在云端运行应用程序的技术。这种技术可以让开发者将应用程序部署到云上,从而简化应用程序的部署和管理。云打包的原理是将应用程序和其它资源打包成一个可执行文件,然后上传到云服务器上
2023-04-06
web app
Web应用程序(Web App)是一种可以通过互联网访问的应用程序,它不需要用户下载或安装,只需在浏览器中访问就可以使用。Web App可以运行在不同的平台上,包括电脑、手机、平板等设备,同时还可以实现跨平台使用。Web App采用的是客户端-服务器的架构
2023-04-06
安卓app怎么打包成苹果
很抱歉,安卓app无法直接打包成苹果应用。这是因为安卓和苹果操作系统采用的技术不同,无法互相兼容。下面我将简单介绍一下安卓和苹果应用的打包原理和流程。安卓应用的打包安卓应用是使用Java语言开发的,打包成apk(Android Package)格式。这种格
2023-04-06
webdriveragent 打包ipa
WebDriverAgent是Facebook开源的一款基于XCTest的iOS自动化测试框架,主要用于实现iOS设备上的UI自动化测试。在iOS开发中,我们通常使用Xcode中的UI测试来进行自动化测试,但是Xcode UI测试只能在模拟器上进行测试,无
2023-04-06
flutter 打包 ios
Flutter 是一个跨平台的移动应用程序开发框架,可以让开发人员使用一套代码构建 iOS 和 Android 应用程序。在 Flutter 中,开发人员可以使用 Dart 语言编写应用程序,并使用 Flutter SDK 中提供的组件和工具创建具有漂亮
2023-04-06
网站ipa
IPA是iOS应用程序的安装包,它是iPhone、iPad、iPod touch等设备上应用程序的安装包。IPA文件可以包含应用程序、图标、资源文件、配置文件等。在iOS设备上安装IPA文件需要通过iTunes或者越狱工具来完成。本文将详细介绍IPA的原理
2023-04-06
vue3打包ios
Vue3 是一种流行的 JavaScript 框架,可用于构建现代 Web 应用程序。在开发过程中,我们需要将应用程序打包为可在移动设备上运行的应用程序。在本文中,我们将讨论如何将 Vue3 应用程序打包为 iOS 应用程序。要将 Vue3 应用程序打包为
2023-04-06
flutter ipa打包
Flutter是一种基于Dart语言的开源框架,可用于构建高性能、高保真度的iOS和Android应用程序。Flutter提供了许多开发工具和API,使得开发人员可以更快地构建、测试和部署应用程序。在本文中,我们将介绍如何使用Flutter打包iOS应用程
2023-04-06
android 开发 xml
XML,全称为Extensible Markup Language,是一种基于文本的标记语言,用于描述数据的结构和内容,可以被应用于各种领域的数据传输和存储。在Android开发中,XML被广泛应用于UI设计和数据传输处理。本文将详细介绍Android开发
2023-04-06