没有合适的资源?快使用搜索试试~ 我知道了~
Window 篇- WindowInsets 与 fitsSystemWindow
0 下载量 102 浏览量
2024-04-09
16:58:43
上传
评论
收藏 8.25MB DOCX 举报
温馨提示
试读
23页
Window 篇- WindowInsets 与 fitsSystemWindow
资源推荐
资源详情
资源评论
Android Detail:Window 篇——
WindowInsets 与
fitsSystemWindow
Flywith24
2021-12-0616,862 阅读 12 分钟
专栏:
Android Detail
前言
很高兴见到你!👋
作为 Android 开发者,不知道你是否遇到这样的问题:
�
不知道如何获取状态栏,导航栏以及软键盘高度
�
�
将内容绘制到状态栏和导航栏区域后发生视觉和交互冲突
�
�
不懂适配 edge-to-edge 的原理
�
�
搞不清 android:fitsSystemWindows 这个属性的作用
�
9 月份纯纯写作的开发者 Drakeet 大佬在扔物线的知识星球中分享了关于 WindowInsets 的视频内
容,视频介绍了以下内容:
� WindowInsets 是什么?
� WindowInsets 如何被分发?
� 如何适配透明手势导航栏(edge-to-edge)?
� 如何准确监听软键盘弹出和获得软键盘高度?
� 如何自定义软键盘弹出后的响应行为?
本文是对该视频的补充,内容大多摘自 Chris Banes 在 2017 年做的演讲:Becoming a master
window fitter🔧(已搬运至 B 站)。
阅读本文,你将了解以下内容:
� System bar 各个版本能力的变化
� App 将内容绘制到 Status bar 和 Navigation bar 后面的原理
� fitsSystemWindows 与 WindowInsets 的概念
� WindowInsets 的分发逻辑
� 处理 WindowInsets 的最佳实践
限于篇幅原因,本文没有太多分析源码。关于底层的实现原理,我们在之后的文章中介绍。仅关心最
佳实践的小伙伴可以直接跳转最佳实践一节。
让我们开始吧~
什么是 Window
在 Android Detail:Window 篇——站在 Window 视角理解 Activity 任务与返回栈一文中我们讨论
过 Android Window 的核心概念并得到一个结论:
在 Android 中,暴露给开发者操作 UI 界面的 API 是 mWindowManager.addView(rootView,
windowParams);
简单说,Android 屏幕上的每一个 view 都是在 Window 内的。
� 每个 Activity 有着自己的 Window(PhoneWindow),Activity#getWindow()
� Dialog 也有自己的 Window,Dialog#getWindow()
� PopupWindow,Toast 也是通过 WindowManager#addView 将 view 置于 Widnow 上的
什么是 Insets
屏幕上除了开发者 app 绘制的内容还有系统的 Insets(插入物),Insets 区域负责描述屏幕的哪些
部分会与系统 UI 相交。如 Starus bar 或 Navigation bar:
常见的 Insets 有:
� STATUS_BAR,用于展示系统时间,电量,wifi 等信息
� NAVIGATION_BAR,虚拟导航栏(区别于实体的三大金刚键),形态有
三大金刚键导航,手势导航两种。(有些设备形态如 TV 没有导航
栏)
� IME,软键盘,用于输入文字
其中 STATUS_BAR 与 NAVIGATION_BAR 又被称为 System bar。
如果开发者绘制的内容出现在了系统 UI 区域内,就可能出现视觉与手势的冲突。开发者可以借助
Insets 把 view 从屏幕边缘向内移动到一个合适的位置。
在源码中,Insets 对象拥有 4 个 int 值,用于描述矩形四个边的偏移:
📢 注意:不要把 Insets 的 top ,bottom,left,right 与 Rect
的搞混,前者描述的是偏移,后者是坐标。
关于 Insets 更详尽的信息,可以 查看这篇文章。
setSystemUiVisibility 与 WTFs
View 的源码中有一个 setSystemUiVisibility() 的方法,虽然该方法在 Android 11 已被弃用,
但按照本专栏的一贯风格,我们还是要来介绍一下该方法。
有些场景开发者可能希望 app 的内容可以绘制到状态栏或导航栏的区域以提供更好的用户体验,因
此系统提供了 setSystemUiVisibility 方法,开发者可以通过向该方法传入不同的 flag 以应对不同
的使用场景。
这些 flag 被称为 Window Transform Flags,简称 WTFs(滑稽脸😏),同样的,它们在 Android 11
中被弃用。常用的 flag 如下:
剩余22页未读,继续阅读
资源评论
NanxiaoPeanut
- 粉丝: 27
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功