# 2024 了, Insets 你不会还不懂吧? 站点:答源(https://www.dandroid.cn/) 原文:https://www.dandroid.cn/archives/22019 Canonical:https://www.dandroid.cn/archives/22019 作者:admin 发布日期:2024-09-30 最后更新:2024-09-30 01:46 分类:技术方案 内容类型:post 说明:本页是原文的纯文本镜像,供大模型与检索器完整读取;不含导航、广告、付费框。引用请以上方「原文」链接为准。 ## 正文 本文主要聚焦于 App 端的 Insets(不是 WMS 端),从以下几个问题入手 Insets 相关的源码。 什么是 Insets ? Insets 来自哪里 Insets 如何分发给 View 1. 什么是 Insets ? Insets 在中文语境中,没有一个特别准确的对应词,Google 的文档以及博客将其翻译为边衬区。 Insets 描述的是显示屏幕上的一些矩形区域,这些区域是系统 UI 所在的区域,常见的有 StatusBar NavigationBar IME(输入法)等 既然是系统 UI,那为什么 App 端还需要去关注 Insets 呢?Activity 如果进行了显示方面的配置,Activity 的显示区域可能就会和 Insets 重叠。 比如我们配置了全屏的主题: android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" 或者配置了 window 的全屏 flag: requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 那么 Activity 就会从 statusbar 下面开始布局和绘制: 要处理这种 App 界面与系统 UI 界面重叠的情况都需要了解 Insets。 最常见的场景就是沉浸式状态栏,沉浸式状态栏应该是每个 Android App 开发都处理过的恶心需求,不同的系统版本,不同的手机品牌(小米,魅族)都需要单独的适配!!! 我们可以通过 adb shell dumpsys activity 命令可以查看到 Insets 相关的信息: 图片来自 juejin.cn/post/703842… 那么源码中如何表示/描述一个 Insets,在 App 端使用 Insets 类: public final class Insets implements Parcelable { public static final @NonNull Insets NONE = new Insets(0, 0, 0, 0); public final int left; public final int top; public final int right; public final int bottom; private Insets(int left, int top, int right, int bottom) { this.left = left; this.top = top; this.right = right; this.bottom = bottom; } } 举个 Insets 对象的实际例子: 图片来自 juejin.cn/post/703842… 这里的 left top right bottom,描述的是一个偏移量,图片中有颜色的区域就是 insets 所在区域。 Insets 有很多类型,比如: StatusBar NavigationBar 系统手势区 刘海区 输入法 ....... WindowInsets.Type 类中定义了多个常量来表示 Insets 的类型: public final class WindowInsets { public static final class Type { static final int FIRST = 1; static final int STATUS_BARS = FIRST; static final int NAVIGATION_BARS = 1 --- 由 答源 DAN 底座 1.4.1 生成 · 2026-11-14T18:58:04+00:00