Compose UI 之 Card 卡片组件

本文介绍了Android Compose UI中的Card组件,包括Filled Card、Elevated Card和Outlined Card三种样式。Card常用于列表数据、信息提示和内容详情页,提供可交互的界面元素。Compose UI为每种卡片样式提供了不同的视觉效果和交互体验,如Filled Card的基础展示,Elevated Card的突出外观,以及Outlined Card的边界强调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Card

Card 是用于显示带有圆角和可选阴影的矩形内容容器。它通常用于构建用户界面,并可以包含标题、文本、图像、按钮等元素,表示界面上的可交互元素,我们称它是 “卡片”。

Card 使用的一些经典的场景:

  • 列表数据,例如 新闻列表,产品列表等。
  • 信息提示框,使用 Card 组件突出显示。
  • 内容详情页卡片。

出上面列出的 3 中场景,还有其较多的场景可以使用卡片组件,这里不再一一列出。

Compose UI 库中定义了 3 种样式的卡片组件。分别是 Filled Card,Elevated Card,Outlined Card。3 种卡片的设计准则是一致的。

Compose-Card_measures.png

属性
外形(shape) 12dp 大小的圆角
左右内边距(left/right padding) 16dp
卡片组件之间的间距 最大 8dp
标签对齐方式 Start-aligned:靠左或靠右(在一些文字从右向左的国家)

它们执行后的样式有所区别。

默认情况下,Card 中的子 composables 布局在一个 column 中,即子 composables 是在竖直方向上一个个排列。

Filled Card

先看下它的声明,它有两个声明方式。

// 下面这个声明的 Card 不接收事件,只用作展示详情信息。
@Composable
fun Card(
    modifier: Modifier = Modifier,
    shape: Shape = CardDefaults.shape,
    colors: CardColors = CardDefaults.cardColors(),
    elevation: CardElevation = CardDefaults.cardElevation(),  // 默认值是没有阴影的。
    border: BorderStroke? = null,
    content: @Composable ColumnScope.() -> Unit
): Unit

// 下面的声明可以用于交互,设置 Card 的可用性。
@Composable
fun Card(
    onClick: () -> Unit,
    modifier: Modifier = Modifier,
    enabled: Boolean = true,
    shape: Shape = CardDefaults.shape,
    colors: CardColors = CardDefaults.cardColors(),
    elevation: CardElevation = CardDefaults.cardElevation(),  // 默认值是没有阴影的。
    border: BorderStroke? = null,
    interactionSource: MutableInteractionSource? = null,
    content: @Composable ColumnScope.() -> Unit
): Unit

上述:

  • 第一个声明是用于展示详情信息使用,不处理点击事件。
  • 第二个声明可以接收点击事件,并可以定义点击回调。

声明中主要的参数说明如下表。

参数名 类型 描述
modifier Modifier 修改或增强组件的某些属性,例如大小、位置、背景等。默认值是Modifier,表示不使用任何特定的修饰符。
shape Shape 定义卡片的形状。默认是CardDefaults.shape,这通常是一个带有圆角的矩形。
colors CardColors 定义卡片的颜色方案。这包括卡片的背景颜色、边框颜色等。默认值是CardDefaults.cardColors(),它提供了一套默认的颜色配置。
elevation CardElevation 定义卡片的阴影或“高度”。这可以给卡片一个立体的外观。默认值是CardDefaults.cardElevation(),它定义了一个默认的阴影效果。
border BorderStroke? 定义卡片的边框样式,如宽度、颜色和形状。默认是null,表示没有边框。
content @Composable ColumnScope.() -> Unit 这是一个Lambda函数,定义了卡片内部的内容。由于它是在ColumnScope中定义的,所以你可以在卡片内部添加列式布局的内容。
interactionSource MutableInteractionSource? 与用户交互相关的状态源,如按下、拖动等。这可以用于创建更复杂的交互效果。默认是null
onClick () -> Unit 这是一个Lambda函数,当用户点击卡片时会被调用。你可以在这里定义点击卡片后应执行的操作。
enabled Boolean 表示卡片是否可以被用户交互。默认为true,意味着卡片默认是可以交互的。

从上述参数列表中,可以看出,第二个声明方式兼容了第一个声明的方式,将 enabled 参数给值 false 并且设置好 colors 参数值,就可以实现与第一个声明同样的效果。

看以下第一个 Card 声明的使用示例如下。

@Composable
fun CardNonclickableSample() {
   
    Box (modifier=Modifier.fillMaxSize().padding(16.dp), contentAlignment = Alignment.Center) {
   
        Card(
            modifier = Modifier.width(250.dp).height(100.dp).background(color=Color.Yellow).padding(5.dp),
            shape = RoundedCornerShape(8.dp),
            colors = CardDefaults.cardColors(containerColor = Color.White, contentColor = Color.DarkGray),
            elevation = CardDefaults.cardElevation(defaultElevation = 6.dp),
            border = BorderStroke(width=2.dp, brush = SolidColor(Color.Green)),
        ) {
   
            Text("这是一个Card组件示例", modifier=Modifier.padding(
### Jetpack Compose Dialog 遮罩的实现与自定义 在 Jetpack Compose 中,`Dialog` 组件用于显示模态对话框。为了创建带有遮罩效果的 `Dialog`,可以利用 `BackdropScaffold` 或者通过组合其他可组合项来构建自定义遮罩。 #### 使用 Backdrop Scaffold 实现遮罩 `BackdropScaffold` 提供了一种简单的方法来创建具有背景层和前景层的内容结构,其中背景部分可以用作遮罩[^1]: ```kotlin import androidx.compose.material.* import androidx.ui.tooling.preview.Preview import com.example.myapp.MyAppTheme @Composable fun MyCustomDialog() { var showDialog by remember { mutableStateOf(true) } if (showDialog) { BackdropScaffold( appBar = {}, backLayerContent = { // 这里放置遮罩内容 Box(modifier = Modifier.fillMaxSize().background(Color.Black.copy(alpha = 0.5f))) }, frontLayerContent = { AlertDialog( onDismissRequest = { /*TODO*/ }, title = { Text("Title") }, text = { Text("This is a custom dialog with backdrop.") }, confirmButton = { Button(onClick = { showDialog = false }) { Text("Confirm") } }) } ) } } @Preview(showBackground = true) @Composable fun DefaultPreview() { MyAppTheme { MyCustomDialog() } } ``` #### 自定义遮罩样式 如果想要更精细地控制遮罩的行为和外观,则可以通过叠加透明度较低的颜色矩形作为遮罩,并将其置于整个屏幕之上,在其上再添加实际的弹窗组件: ```kotlin import androidx.compose.foundation.layout.Box import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties // 定义一个函数用来展示带遮罩的对话框 @Composable fun CustomOverlayDialog(content: @Composable () -> Unit) { val openDialog = remember { mutableStateOf(true) } if (openDialog.value) { Dialog( onDismissRequest = { openDialog.value = false }, properties = DialogProperties(usePlatformDefaultWidth = false), ) { Box(modifier = Modifier.fillMaxSize()) { // 添加半透明黑色覆盖全屏区域作为遮罩 Box( modifier = Modifier.matchParentSize().background(color = Color(0x80000000)) ) // 居中的白色卡片容器承载具体dialog内容 Card( shape = RoundedCornerShape(size = 16.dp), elevation = 8.dp, backgroundColor = Color.White, content = content ) } } } } ``` 上述两种方式都可以有效地实现在 Jetpack Compose 应用程序中加入遮罩的效果。开发者可以根据需求选择合适的方式来进行开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

VoidHope

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

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

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

打赏作者

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

抵扣说明:

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

余额充值