Jetpack compose ui: как создать cardview?

Я хочу создать Cardview с помощью Jetpack Compose, но я не могу найти ни одного примера.

https://stackru.com/images/b59c2df2667394ca8050df6c8117463f9f4ab6c6.png

Заранее спасибо.

4 ответа

С 1.0.0-alpha01 вы можете использовать что-то вроде:

Card(
    shape = RoundedCornerShape(8.dp),
    backgroundColor = MaterialTheme.colors.surface,
    ) {
    Box(
        padding = 16.dp,
        modifier = Modifier.height(200.dp),
        gravity = Alignment.Center
    ){
        Text(text = "This is a card view",
            style = MaterialTheme.typography.h4)
    }
}

В v0.1.0-dev09 версии, можно сделать так, где заполнение Card устанавливает поле карты, заполнение Box устанавливает отступ внутри карты.

Card(
  shape = RoundedCornerShape(8.dp), 
  modifier = Modifier.padding(16.dp).fillMaxWidth()
) {
  Box(modifier = Modifier.height(200.dp).padding(16.dp)) {
    Text("This is a card view")
  }
}

Скриншот карты

Как рекомендовали друзья, это способ творить, но вы можете сделать это и на поверхности:

      val shape = RoundedCornerShape(10.dp)
Surface(modifier = Modifier.size(250.dp, 70.dp), elevation = 8.dp, shape = shape) {
      Text(text = "Sample text")
}

Обратите внимание, что и Card не может использоваться для позиционирования элементов, так что если вы хотите разместить это Text(text = "Sample text") , вы должны использовать один макет внутри этого Surface нравится :

      val shape = RoundedCornerShape(10.dp)
Surface(modifier = Modifier.size(250.dp, 70.dp), elevation = 8.dp, shape = shape) {
    Box(modifier = Modifier.fillMaxSize()) {
          Text(modifier = Modifier.align(Alignment.Center), text = "Sample text")
    }
}

Подходящий способ создания CardView это так, но если вы хотите просто создать тень для вида, вы можете использовать (Обратите внимание, что Modifier.shadow а также Surface/Card не то же самое):

      Box(modifier = Modifier.size(250.dp, 70.dp).shadow(8.dp, RoundedCornerShape(10.dp)), contentAlignment = Alignment.Center) {
        Text(text = "Sample Text")
}

Код :

          class ImageCardActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val painter = painterResource(id = R.drawable.grogu)
            val contentDescription = "Grogu says hi"
            val title = "Force is strong with Grogu"

            Column(
                modifier = Modifier.fillMaxSize(),
                verticalArrangement = Arrangement.Center,
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                Box(
                    modifier = Modifier.fillMaxWidth(0.5f)
                ) {
                    ImageCard(
                        title = title,
                        contentDescription = contentDescription,
                        painter = painter
                    )
                }
            }
        }
    }
}

@Composable
fun ImageCard(
    title: String,
    contentDescription:String,
    painter: Painter,
    modifier:Modifier=Modifier
){
    Card(
        modifier = modifier.fillMaxWidth(),
        shape = RoundedCornerShape(18.dp),
        elevation = 5.dp
    ) {
        Box(
            modifier = Modifier.height(200.dp)
        ) {
            // Image
            Image(
                painter = painter,
                contentDescription = contentDescription,
                contentScale = ContentScale.Crop
            )
            // Gradient
            Box(
                modifier = Modifier
                    .fillMaxSize()
                    .background(
                        brush = Brush.verticalGradient(
                            colors = listOf(
                                Color.Transparent, Color.Black
                            ),
                            startY = 300f
                        )
                    )
            )
            // Title
            Box(
                modifier = Modifier
                    .fillMaxSize()
                    .padding(12.dp),
                contentAlignment = Alignment.BottomStart
            ) {
                Text(
                    text = title,
                    style = TextStyle(color = Color.White, fontSize = 12.sp)
                )
            }
        }
    }
}

Другие вопросы по тегам