带有圆角的波纹 Jetpack Compose

问题描述

this 答案中,我弄错了涟漪动画。您知道如何使用 Jetpack Compose 创建带有圆角的波纹吗?

使用认波纹我有这个:

Ripple

代码

Card(shape = RoundedCornerShape(30.dp),border = Borderstroke(width = 2.dp,color = buttonColor(LocalContext.current)),backgroundColor = backColor(LocalContext.current),modifier = Modifier
            .fillMaxWidth()
            .padding(10.dp)
            .clickable(
                interactionSource = remember { MutableInteractionSource() },indication = rememberRipple(radius = 30.dp)
            ) { show = !show }
    ) { ... } //Show is animation of other element.

//如果我放波纹半径为200 dp(这是卡的高度)波纹效果不正常。

解决方法

1.0.0-beta08 开始,您可以使用 onClick 中的 Card 参数代替 clickable 修饰符来解决此问题:

Card(shape = RoundedCornerShape(30.dp),modifier = Modifier
        .fillMaxWidth()
        .padding(10.dp),onClick = { show = !show }
) 

直到 1.0.0-beta07.clickable 修饰符应用到 Card 之前,涟漪不会被布局的边界剪掉。

作为解决方法,您可以将 .clickable 修饰符应用于卡片的内容(例如 Box):

    Card(
        shape = RoundedCornerShape(30.dp),border = BorderStroke(width = 2.dp,color = Color.Blue),backgroundColor = Color.White,modifier = Modifier
            .fillMaxWidth()
            .padding(10.dp)

    ) {
        Box(Modifier
              .clickable(
                  onClick = { /* ...*/ }
              )
        ){
            Text("Text")
        }
    }
,

到目前为止,我已经确定了 2 个选项:

  1. 除了设置形状之外,还可以使用 .clip 修饰符来剪裁使用相同形状的卡片:
Card(
    shape = RoundedCornerShape(30.dp),modifier = Modifier
        .clip(RoundedCornerShape(30.dp))
        .clickable {
                //do something
        }
) {
    Box {
        Text("Text")
    }
}

这种方法的缺点是高程阴影也会被剪辑,所以你的卡片会失去它的阴影。

  1. 在可组合的卡片内容上设置 .clickable
 Card(
    shape = RoundedCornerShape(30.dp)
) {
    Box(
        modifier = Modifier.clickable {
                //do something
        }
    ) {
        Text("Text")
    }
}