android Compose中沉浸式设计、导航栏、状态栏的处理

简介: android Compose中沉浸式设计、导航栏、状态栏的处理

Material Design风格的顶部和底部导航栏


Compose中Material Design风格的设计我们的做法如下:

1、使用Scafoold作为页面的顶级,Scafoold中承载topbar和bottombar分别作为顶部导航栏和底部导航栏。

2、调用WindowCompat.setDecorFitsSystemWindows(window, false)方法让我们的布局超出状态栏和底部导航栏的位置 3、使用ProvideWindowInsets包裹布局,使我们可以获取到状态栏和底部导航栏的高度(不包裹无法获取状态栏和底部导航栏高度) 4、手动处理顶部和底部导航栏让页面适应屏幕


界面设计


TopBar设计

实现方式

因为使用WindowCompat.setDecorFitsSystemWindows(window, false)设置后页面布局顶到了状态栏的上面,因为我们需要用一个Spacer来填充状态栏,让我们的布局看起来正常点


代码

如下是封装的状态栏方法

@Composable
fun TopBarView(title: String, callback: () -> Unit) {
    Column {
        Spacer(
            modifier = Modifier
                .statusBarsHeight()//设置状态栏高度
                .fillMaxWidth()
        )
        TopAppBar(title = {
            Text(title)
        }, navigationIcon = {
            IconButton(onClick = {
                callback()
            }) {
                Icon(Icons.Filled.ArrowBack, "")
            }
        })
    }
}
复制代码


处理状态栏前后的ui状态

处理前:

image.png

处理后:

image.png

结论是经过我们的处理后解决了状态栏的遮挡


BottomBar设计

实现方式

因为使用ProvideWindowInsets包裹后底部导航栏顶到了底部,所以需要填充一个底部导航栏高度的Spacer。


代码

bottomBar = {
            Column {
                Row(
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(60.dp)
                        .background(statusbarColor),
                    horizontalArrangement = Arrangement.SpaceAround,
                    verticalAlignment = Alignment.CenterVertically
                ){
                    Text(text = "首页")
                    Text(text = "通讯录")
                    Text(text = "朋友圈")
                    Text(text = "我的")
                }
                Spacer(modifier = Modifier.navigationBarsHeight())
            }
        }
复制代码


处理状态栏前后的ui状态

处理前:

image.png

处理后:

image.png

结论是经过我们的处理后解决了底部导航栏的遮挡问题


状态栏和底部导航栏颜色的处理

状态栏和底部导航栏颜色设置

依赖

implementation "com.google.accompanist:accompanist-insets:0.16.0"
    implementation "com.google.accompanist:accompanist-systemuicontroller:0.16.0"
复制代码


代码

rememberSystemUiController().run {
                    setStatusBarColor(statusbarColor, false)
                    setSystemBarsColor(statusbarColor, false)
                    setNavigationBarColor(statusbarColor, false)
                }
复制代码


整体效果

我们发现状态栏和底部导航栏的颜色都变了

image.png


如何处理内容部分超出底部导航栏的区域


使用WindowCompat.setDecorFitsSystemWindows(window, false)处理了页面后,Scafoold的内容区域也会被顶到底部导航栏的下方,同样也需要我们处理

以下是处理前和处理后的代码和效果


处理前

代码

LazyColumn() {
            items(30) { index ->
                Box(
                    modifier = Modifier
                        .padding(top = 10.dp)
                        .fillMaxWidth()
                        .height(50.dp)
                        .background(Color.Green),
                    contentAlignment = Alignment.Center
                ) {
                    Text(text = index.toString())
                }
            }
        }
复制代码


效果

这里只展示到第27个item,第28、29个item没有展示出来,所以需要处理才行

image.png


处理后

代码

{padding->
        LazyColumn(Modifier.padding(bottom = padding.calculateBottomPadding())) {//这里会计算出距离底部的距离,然后设置距离底部的padding
            items(30) { index ->
                Box(
                    modifier = Modifier
                        .padding(top = 10.dp)
                        .fillMaxWidth()
                        .height(50.dp)
                        .background(Color.Green),
                    contentAlignment = Alignment.Center
                ) {
                    Text(text = index.toString())
                }
            }
        }
    }
复制代码


效果

改正后的第29个item展示了出来

image.png

代码:github.com/ananananzhu…



相关文章
|
3月前
|
IDE API 开发工具
Google I/O :Android Jetpack 最新变化(四)Compose
Google I/O :Android Jetpack 最新变化(四)Compose
106 0
|
1月前
|
XML API Android开发
【Android 从入门到出门】第三章:使用Hilt处理Jetpack Compose UI状态
【Android 从入门到出门】第三章:使用Hilt处理Jetpack Compose UI状态
26 4
|
3月前
|
Android开发 Kotlin 索引
Android Compose——ScrollableTabRow和LazyColumn同步滑动
Android Compose——ScrollableTabRow和LazyColumn同步滑动
|
3月前
|
Android开发
解决在Android Compose中点击空白处收回软键盘
解决在Android Compose中点击空白处收回软键盘
|
3月前
|
移动开发 数据库 Android开发
不止 Android!Compose Multiplatform 来了
不止 Android!Compose Multiplatform 来了
72 0
|
4月前
|
XML Java Android开发
Android Studio App开发中工具栏Toolbar、溢出菜单OverflowMenu、标签布局TabLayout的讲解及实战(实现京东App的标签导航栏,附源码)
Android Studio App开发中工具栏Toolbar、溢出菜单OverflowMenu、标签布局TabLayout的讲解及实战(实现京东App的标签导航栏,附源码)
61 0
|
8月前
|
缓存 Android开发 Kotlin
【Android】Jetpack Compose 环境配置
【Android】Jetpack Compose 环境配置
143 0
|
9月前
|
缓存 Dart 监控
现代化 Android 开发:Jetpack Compose 最佳实践
如果一直关注 `Compose` 的发展的话,可以明显感受到 2022 年和 2023 年的 `Compose` 使用讨论的声音已经完全不一样了, 2022 年还多是观望,2023 年就有很多团队开始采纳 `Compose` 来进行开发了。不过也有很多同学接触了下 `Compose`,然后就放弃了。要么使用起来贼特么不顺手,要么就是感觉性能不行,卡。其实,问题只是大家的思维没有转换过来,还不会写 `Compose`。
291 1
|
10月前
|
Android开发
Android的Dialog弹出时隐藏导航栏效果,目前认为的最优解
Android的Dialog弹出时隐藏导航栏效果,目前认为的最优解
|
10月前
|
Java 测试技术 API
Android透明状态栏和导航栏方案最终版
Android透明状态栏和导航栏方案最终版
549 0