我正试着用Jetpack Compose在卡片的底部创建一个边框.

有点像这样,以便让卡片感觉到它有厚度.

border bottom

我用两张卡片叠在一起,成功地做到了这一点

    Box(modifier = Modifier
        .wrapContentSize()
        .padding(5.dp)
        .padding(25.dp)
        .padding(0.dp,0.dp,0.dp,15.dp)) {

        Card(
            modifier = Modifier
                .size(180.dp, 200.dp)
                .offset(10.dp, 12.dp),
            elevation = CardDefaults.cardElevation(
                defaultElevation = 10.dp
            )
        ) {
        }
        Card(
            modifier = Modifier
                .size(180.dp, 200.dp)
                .offset(10.dp, 10.dp),
            elevation = CardDefaults.cardElevation(
                defaultElevation = 10.dp
            )
        ) {
        }
    }

但对我来说,这感觉像是一个相当老套的解决方案,也是我想要避免的. 所以我想知道有没有其他方法来创造类似的效果?

推荐答案

你可以try 用drawBehind个修改器进行实验.堆叠圆形矩形也涉及,但它看起来更干净,我.

下面的代码片断会产生以下结果:

Card with thickness

当您取消对带有半透明backgroundColor的线条的注释时,您可以看到卡片后面绘制的内容(它是全圆角矩形,因为您不能使用此方法在画布上单独设置角点):

Card with transparent background

@Preview
@Composable
fun CardWithThickness(modifier: Modifier = Modifier) {
    val cardHeightDp = 100.dp
    val cornerRadiusDp = 20.dp
    val borderThicknessDp = 2.dp
    Box(
        modifier = Modifier.padding(bottom = borderThicknessDp)
    ) {
        Card(
            // backgroundColor = Color(0x99999999),
            shape = RoundedCornerShape(size = cornerRadiusDp),
            modifier = Modifier
                .size(180.dp, cardHeightDp)
                .drawBehind {
                    drawRoundRect(
                        color = Color.Red,
                        topLeft = Offset(0f, (cardHeightDp - 2 * cornerRadiusDp).toPx()),
                        size = this.size.copy(height = (2 * cornerRadiusDp + borderThicknessDp).toPx()),
                        cornerRadius = CornerRadius(cornerRadiusDp.toPx())
                    )
                },
        ) {
            // ...
        }
    }
}

Android相关问答推荐

如何在Jetpack Compose中使用Box Composable来实现这种布局?

请求标头为空/无法通过拦截器获取

MAP函数返回单位列表而不是字符列表

属性可选的涟漪效果ItemBackEarth Borderless不适用于Android 13和更高版本

数据绑定在Android中等待填充值时显示未填充的值

Hilt+Worker NoSuchMethodException:<;init>;[class android.content.Context,class androidx.work.WorkerParameters]

由于Xcode运行脚本阶段没有指定输出,在IOS Emulator中的KMM项目中生成失败

Android 12+BLE字节不同

使用 JNI 从 Android 应用程序中使用 Kotlin/Native 预构建共享库

从包含的(复合)模块导入 Kotlin 类时,Android 应用程序模块的 build.gradle.kts 未解决的引用错误

Android Jetpack Compose 电视焦点恢复

如何在 Jetpack Compose 中将文本绘制在另一个对象的中心?

通知使用默认语言,屏幕显示多种语言,同时通过 AppCompatDelegate 设置应用程序语言

Kotlin 协程、 retrofit 、android

如何在 JetpackCompose 的 LazyColumn 中 Select 多个项目

Android build gradle 文件版本代码自动递增

在 Jetpack Compose 中找不到 Path 的减号()

预览必须是顶级声明或具有默认构造函数的顶级类

Google Play 服务登录在 Unity Android 上无法正常运行

单击后退按钮时,应用程序会在一秒钟后崩溃