JetpackCompose实现沉浸式导航条

基于 compose

安装依赖
implementation "com.google.accompanist:accompanist-insets:0.15.0"
implementation "com.google.accompanist:accompanist-insets-ui:0.15.0"
implementation "com.google.accompanist:accompanist-systemuicontroller:0.15.0"

成果图

在这里插入图片描述


MainActivity.kt

首先在 oncreate 方法里面按照注释中的三步依次添加代码

class MainActivity : ComponentActivity() {

    @RequiresApi(Build.VERSION_CODES.R)
    override fun onCreate(savedInstanceState: Bundle?) {

        // 第一步
        WindowCompat.setDecorFitsSystemWindows(window,false)

        super.onCreate(savedInstanceState)
        setContent {
            AidtTheme {

                // 第二步,强制设置状态栏的颜色
                rememberSystemUiController().setStatusBarColor(
                    Blue500,
                    darkIcons = MaterialTheme.colors.isLight
                )

                // 第三步,ProvideWindowInsets嵌套主体
                ProvideWindowInsets {
                    Surface(
                        modifier = Modifier.fillMaxSize(),
                        color = MaterialTheme.colors.background
                    ) {
                        mainBody()
                    }
                }
            }
        }

    }
}

mainBody 主体代码实现

主要方法就是让 scaffold 原理顶部一个状态栏的高度,然后底部导航条也这么做就 OK 了

@Composable
private fun mainBody() {
    ...

    // 第一步:获取顶部状态栏的高度
    val statusBarHeight = with(LocalDensity.current){
        LocalWindowInsets.current.statusBars.top.toDp()
    }

    Scaffold(
        topBar = {
            TopAppBar(

                // 第二步:使用padding让scaffold与顶部隔开一个状态栏的高度
                modifier = Modifier.padding(top = statusBarHeight),

                title = { Text("主页") },
                navigationIcon = {
                    IconButton(onClick = { scope.launch { scaffoldState.drawerState.open() } }) {
                        Icon(Icons.Filled.Menu, null)
                    }
                }
            )
        },
        bottomBar = {
            BottomNavigation(
                // 第三步:使底部导航条在底部控制条的上方
                modifier = Modifier.navigationBarsPadding()
            ) {
                items.forEachIndexed { index, item ->
                    BottomNavigationItem(
                        selected = selectedItem == index,
                        onClick = {
                            selectedItem = index
                            navChangePath(item.route)
                        },
                        icon = { Icon(painterResource(item.icon), null) },
                        alwaysShowLabel = false,
                        label = { Text(item.name) }
                    )
                }
            }
        },
    ) {
        ...
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhillery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值