Jetpack Compose 中如何实现全面屏

news/2024/5/19 22:33:58

看问题本质,设置全面屏,是系统窗口的行为,与 View 和 Compose 有什么关系呢?
所以,原理和传统 View 视图是一样的,甚至 Api 都是一模一样的,不熟悉的可以看我之前的文章。传送门:

Android 全面屏体验

那为什么还要写这篇文章呢?主要是在 Compose 中写法上的一些区别,直接上代码:

找到主题设置的代码,默认生成的主题如下:

@Composable
fun HelloComposeTheme(darkTheme: Boolean = isSystemInDarkTheme(),// Dynamic color is available on Android 12+dynamicColor: Boolean = true,content: @Composable () -> Unit
) {val colorScheme = when {dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {val context = LocalContext.currentif (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)}darkTheme -> DarkColorSchemeelse -> LightColorScheme}val view = LocalView.currentif (!view.isInEditMode) {SideEffect {val window = (view.context as Activity).windowwindow.statusBarColor = colorScheme.primary.toArgb()WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme}}MaterialTheme(colorScheme = colorScheme,typography = Typography,content = content)
}

与系统状态栏,导航栏相关的代码:

修改如下:

val view = LocalView.currentif (!view.isInEditMode) {SideEffect {val window = (view.context as Activity).window// window.statusBarColor = colorScheme.primary.toArgb()// 设置状态栏和导航栏透明window.statusBarColor = Color.TRANSPARENTwindow.navigationBarColor = Color.TRANSPARENT// 让内容可以显示到状态栏和导航栏下面区域WindowCompat.setDecorFitsSystemWindows(window, false)// light 主题显示深色,dark 主题显示浅色,强制显示深色,就设为 true, 前置显示浅色就设为 falseWindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme // 导航栏默认会有一层半透明遮罩, 这行代码,去掉默认半透明遮罩window.isNavigationBarContrastEnforced = false}}

还剩一个问题,大多数时候,我们虽然希望内容延伸到状态栏和导航栏下面,但是并不希望内容被系统栏挡住,只是想要达到背景颜色保持一致的效果。解决思路就是顶层 View 设置了背景颜色,然后给它上下流出 padding, 其中 top padding 即为状态栏高度,bottom padding 为导航栏的高度。

传统View视图有两种解决方案:

  • 动态设置。新的 api 获取 statusBarHeight 和 navigationBarHeight,需要通过在 Activity 中注册监听,在回调中获取。这个回调时机可能晚于一些初始化工作,所以,只能在回调中动态设置。
  • 在 xml 文件中,根布局设置 fitsSystemWindows 属性为 true

最后来说说,Compose 中如何设置呢?
Compose Modifier 中提供了一个 api —— Modifier.systemBarsPadding() 即可。

本文完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/25405.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

4.26文件上传学习

文件上传,绕过,验证,检测一、文件上传 概念:(不赘述转web安全文件上传)[[9.6-9.7基础和过滤方式]] 前置知识:(除解析漏洞)后门代码需要以特定格式后缀解析,不能以图片后缀解析; 知识点 1、文件上传-前端验证 直接修改前端js代码,文件上传格式; 2、黑白名单 3、use…

Python-Flask-migrate安装和使用

在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库。最直接的方式就是删除旧表,但这样会丢失数据。 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。 环境…

MySQL-07.InnoDB数据存储结构

C-07.InnoDB数据存储结构 1.数据库的存储结构:页索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的存储引擎负责对表中数据的读取和写入工作。不同存储引擎中存…

以链表为基础实现链式队列——————遍历、入队、出队

以链表为基础实现链式队列 ​ 如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。​ 需要注意的点:遍历队列需要备份地址 出队需要考虑空…

Windows设置开机自启动项

一、常见软件的开机自启设置大部分安装的软件,在设置中都带有“设置开机自启”的选项,直接在软件本身的设置中勾选相应开关项即可。 二、本身无开机自启的软件或一些绿色便携式的软件 (一)实现原理Windows自带了一个启动文件夹,在此文件夹中的软件都会在开机后进行启动操作…

Unsortbin attack原理及分析

Unsortbin attack原理 ✔️条件:首先要实现Unsortbin attack前提是可以控制Unsortbin attack chunk的bk指针 ✔️目的:我们可以实现修改任意地址为一个比较大的值 ✔️原理:1.Unsortbin的来源 1.当一个较大的 chunk 被分割成两半后,如果剩下的部分大于MINSIZE,就会被放到 …

npm run dev, serve和build的区别

真实命令分别为npm run vite,npm run vite build,npm run vite preview ctrl+c结束运行的npm项目

谷歌 hackbar 不能使用的问题

谷歌 hackbar 不能使用的问题 下载 hackbar 插件:https://github.com/Mr-xn/hackbar2.1.3 解压文件,将其拖入 chrome 扩展程序中点击详情,点击下面来源的链接 会跳转到插件的安装位置,进入theme/js文件,打开hackbar-panel.js文件,将以下三处disable_hackbar()函数替换成i…