You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Compose中Scaffold的BottomBar裁剪后残留白色背景求助

Jetpack Compose Scaffold底部导航栏裁剪后仍残留白色背景问题

问题描述

在Jetpack Compose中对Scaffold的BottomBar做自定义裁剪后,底部始终有无法去除的白色背景。

问题截图

相关代码

@Composable
fun HomePage(
    mainActions: MainActions,
    homeViewModel: HomeViewModel = viewModel(),
) {
    val navCtrl = rememberNavController()
    Scaffold(
        Modifier.navigationBarsPadding(),
        backgroundColor = Color.Red,
        bottomBar = {
            BottomNavigation(homeViewModel,
                onTapBottom = {
                    navigatorTo(navCtrl, it)
                })
        }) { innerPadding ->
        NavHost(
            navCtrl,
            startDestination = NavigationRoute.homeRoute,
            Modifier.padding(innerPadding)
        ) {
            composable(NavigationRoute.homeRoute) {
                OneFragment()
            }
            composable(NavigationRoute.widgetRoute) {
                val vieModel: MessageViewModel = viewModel()
                TwoFragment(mainActions, vieModel)
            }
            composable(NavigationRoute.settingRoute) {
                ThreeFragment(mainActions)
            }
        }
    }
}


//自定义裁剪部分
//背景动画
@Composable
private fun BottomBarAnimalBgView(indexValue: Float) {
    Canvas(modifier = Modifier
        .fillMaxWidth()
        .height(70.dp), onDraw = {
        drawIntoCanvas { canvas ->
            val paint = Paint()
            paint.color = Color(0xFF108888)//Color(0XFF0DBEBF)
            paint.style = PaintingStyle.Fill
            //先固定分为三等分
            val widthOfOne = size.width / 3
            //每一个弧度的中心控制点
            val centerWidthOfOneX = widthOfOne / 2
            //弧度端口到两边ONewidth距离
            val marginLeftAndRight = centerWidthOfOneX / 1.6f

                val controllerX = centerWidthOfOneX / 6f

                val keyAnimal = widthOfOne * indexValue
                canvas.save()
                paint.asFrameworkPaint().setShadowLayer(
                    15f,
                    5f,
                    -6f,
                    Color(0xFF108888).toArgb()
                )
                canvas.drawCircle(Offset(centerWidthOfOneX + keyAnimal, 0f), 60f, paint)

            val path = Path().apply {
                moveTo(0f, 0f)
                lineTo(marginLeftAndRight / 2 + keyAnimal, 0f)
                cubicTo(
                    marginLeftAndRight + keyAnimal,
                    0f,
                    centerWidthOfOneX - (centerWidthOfOneX - controllerX) / 2f + keyAnimal,
                    size.height / 3f,
                    centerWidthOfOneX + keyAnimal,
                    size.height / 2.6f
                )
                cubicTo(
                    centerWidthOfOneX + (centerWidthOfOneX - controllerX) / 2f + keyAnimal,
                    size.height / 2.6f,
                    widthOfOne - (marginLeftAndRight) + keyAnimal,
                    0f,
                    widthOfOne - marginLeftAndRight / 2 + keyAnimal,
                    0f
                )
                lineTo(size.width, 0f)
                lineTo(size.width, size.height)
                lineTo(0f, size.height)
                close()
            }

            canvas.drawPath(path, paint)

            //裁剪
            val clipPath = Path().apply {
            moveTo(0f, 0f)
            lineTo(marginLeftAndRight / 2 + keyAnimal, 0f)
            cubicTo(
                marginLeftAndRight + keyAnimal,
                0f,
                centerWidthOfOneX - (centerWidthOfOneX - controllerX) / 2f + keyAnimal,
                size.height / 3f,
                centerWidthOfOneX + keyAnimal,
                size.height / 2.6f
            )
            cubicTo(
                centerWidthOfOneX + (centerWidthOfOneX - controllerX) / 2f + keyAnimal,
                size.height / 2.6f,
                widthOfOne - (marginLeftAndRight) + keyAnimal,
                0f,
                widthOfOne - marginLeftAndRight / 2 + keyAnimal,
                0f
            )
            lineTo(size.width, 0f)
            close()
            }
            canvas.clipPath(clipPath,ClipOp.Difference)
        }
    })
}

问题分析

  • 相同裁剪逻辑在Flutter中可正常移除背景
  • 不使用Scaffold时BottomBar显示正常,推测白色背景来自Scaffold底部导航栏的默认背景色

解决方案

核心是覆盖BottomNavigation的默认白色背景:

  1. 如果使用官方BottomNavigation组件,直接给它设置backgroundColor = Color.Transparent
  2. 若为自定义封装的BottomNavigation,在其根布局添加透明背景参数
  3. 也可以给BottomBarAnimalBgView的Modifier追加background(Color.Transparent),确保Canvas底层无默认背景

示例修改(针对官方BottomNavigation):

BottomNavigation(
    backgroundColor = Color.Transparent, // 添加该行覆盖默认背景
    homeViewModel,
    onTapBottom = {
        navigatorTo(navCtrl, it)
    }
)

内容的提问来源于stack exchange,提问作者fei wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:15:45