免费试用

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


相关知识:
贵阳app开发
贵阳是中国的一个中西部城市,近年来随着移动互联网的普及,贵阳市的App开发行业也逐渐兴起。本文将介绍贵阳App开发的原理和详细流程。一、App开发的原理App是指应用程序,是一种运行在移动设备上的软件。App开发的原理是将计算机程序代码编写成移动设备可以识
2023-04-06
android 在线开发
Android是一种基于Linux的开源移动操作系统,是目前世界上使用最广泛的移动操作系统之一。由于Android系统的开放性和通用性,越来越多的开发者开始使用Android系统进行应用程序开发。而在线开发则是一种基于云计算技术,通过互联网进行软件开发的一
2023-04-06
flutter 安卓打包
Flutter是Google推出的一款跨平台开发框架,可以用一套代码同时构建iOS和Android应用程序。在Flutter中,我们可以通过命令行工具来构建和打包应用程序。本文将介绍Flutter安卓打包的原理和详细步骤。一、原理Flutter的打包过程主
2023-04-06
ios描述文件
iOS描述文件是一个包含设备、证书和配置文件的XML文件,它通常用于在iOS开发中对应用程序进行分发和安装。该文件可以包含应用程序的签名和授权信息,以及其他必要的配置信息。iOS描述文件的主要目的是允许开发者和企业在不使用App Store的情况下分发和安
2023-04-06
url吊起app
在移动互联网时代,许多应用程序都需要通过跳转链接的方式实现数据传递和功能调用。URL(Uniform Resource Locator,统一资源定位符)是在互联网上用于定位和访问资源的字符串。URL吊起App,是指通过打开特定的URL链接来启动应用程序。本
2023-04-06
appstore ipa
App Store是苹果公司推出的应用程序下载平台,用户可以在该平台上下载各种应用程序,包括游戏、社交网络应用、生产力工具、影音娱乐等等。这些应用程序都以ipa格式发布在App Store上,用户可以通过App Store直接下载安装。那么,什么是ipa格
2023-04-06
apktool打包apk
APKTool是一款开源的Android应用程序包反编译和打包工具。它可以将一个已经打包好的apk文件进行反编译,得到其中的资源文件和代码文件,然后对这些文件进行修改后再进行打包,生成新的apk文件。APKTool的主要用途是对apk进行逆向工程,以便于开
2023-04-06
安卓aab
Android App Bundle(AAB)是一种新的应用程序分发格式,它旨在优化应用程序的大小,以提高应用程序的性能和用户体验。AAB文件包含应用程序的所有资源和代码,但它们并不是一种安装包,而是一种打包格式。在用户下载应用程序时,Google Pla
2023-04-06
安卓apk模版
安卓apk模版是一种用于创建安卓应用程序的模板。它是一个预先定义的代码框架,可以帮助开发者快速创建应用程序,而不必从头开始编写代码。这种模板通常包含了一些基本功能和常用组件,如用户界面、数据存储、网络通信等等,可以帮助开发者更快地构建出一个完整的应用程序。
2023-04-06
h5封装成ipa
H5是一种基于Web技术的应用开发模式,其具有跨平台、开发周期短、维护成本低等优势,因此被广泛应用于移动应用的开发中。但是,由于H5是基于Web技术开发的,因此其性能较差,无法与原生应用相媲美。为了解决这个问题,开发者们尝试将H5封装成IPA(iOS应用程
2023-04-06
iosipa,cn
iOSIPA.cn 是一个提供 iOS 应用免费下载的网站,其原理是通过收集和分享苹果 App Store 中的 IPA 文件,供用户下载和安装到自己的 iOS 设备上。IPA 文件是苹果公司为 iOS 设备开发者提供的一种应用程序安装包格式,其中包含了应
2023-04-06
ipa获取网站
IPA是iOS应用程序的安装包,它是由苹果公司签名的,只有经过苹果公司审核的应用程序才能在App Store上架。但是,有时候我们可能需要下载一些未上架的应用程序,这时就需要使用IPA获取网站。IPA获取网站的原理是通过越狱或者企业签名的方式来获取未上架的
2023-04-06