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

如何在Android Jetpack Compose中创建如图所示的自定义形状?

在Jetpack Compose中创建自定义底部凹口形状

实现步骤

要制作图中顶部圆角、底部中间带凹口的自定义形状,只需继承Compose的Shape接口,重写createOutline方法,通过Path手动绘制轮廓即可。

1. 自定义Shape类

import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Outline
import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp

class BottomNotchedShape(
    private val cornerRadius: Float = 16.dp.toPx(),
    private val notchRadius: Float = 24.dp.toPx()
) : Shape {
    override fun createOutline(
        size: Size,
        layoutDirection: LayoutDirection,
        density: Density
    ): Outline {
        val path = Path().apply {
            // 起始点:左上角圆角左侧端点
            moveTo(cornerRadius, 0f)
            
            // 绘制顶部直线到右上角圆角左侧端点
            lineTo(size.width - cornerRadius, 0f)
            
            // 绘制右上角圆角
            arcTo(
                rect = androidx.compose.ui.geometry.Rect(
                    left = size.width - cornerRadius,
                    top = 0f,
                    right = size.width,
                    bottom = cornerRadius
                ),
                startAngleDegrees = 270f,
                sweepAngleDegrees = 90f,
                forceMoveTo = false
            )
            
            // 绘制右侧垂直直线到底部
            lineTo(size.width, size.height)
            
            // 绘制底部右侧直线到凹口右侧端点
            lineTo(size.width / 2 + notchRadius, size.height)
            
            // 绘制底部中间凹口圆弧
            arcTo(
                rect = androidx.compose.ui.geometry.Rect(
                    left = size.width / 2 - notchRadius,
                    top = size.height - notchRadius,
                    right = size.width / 2 + notchRadius,
                    bottom = size.height + notchRadius
                ),
                startAngleDegrees = 0f,
                sweepAngleDegrees = 180f,
                forceMoveTo = false
            )
            
            // 绘制底部左侧直线到左下角
            lineTo(0f, size.height)
            
            // 绘制左侧垂直直线到左上角圆角底部端点
            lineTo(0f, cornerRadius)
            
            // 绘制左上角圆角
            arcTo(
                rect = androidx.compose.ui.geometry.Rect(
                    left = 0f,
                    top = 0f,
                    right = cornerRadius,
                    bottom = cornerRadius
                ),
                startAngleDegrees = 180f,
                sweepAngleDegrees = 90f,
                forceMoveTo = false
            )
            
            // 闭合路径
            close()
        }
        return Outline.Generic(path)
    }
}

2. 在Compose组件中使用

直接将自定义形状应用到Surface、Box等支持形状的组件即可:

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp

@Composable
fun NotchedShapeDemo() {
    // 使用Surface
    Surface(
        shape = BottomNotchedShape(),
        color = Color(0xFF2196F3),
        modifier = Modifier.size(300.dp, 200.dp)
    ) {
        // 内部可添加任意子组件
    }

    // 或使用Box+background
    Box(
        modifier = Modifier
            .size(300.dp, 200.dp)
            .background(Color(0xFF2196F3), shape = BottomNotchedShape())
    )
}

参数自定义说明

  • cornerRadius:控制顶部两个圆角的大小,默认16dp
  • notchRadius:控制底部凹口的圆弧半径,默认24dp
    可根据视觉需求调整这两个参数,快速适配不同尺寸的形状。

内容的提问来源于stack exchange,提问作者Kawan Osman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:20:23