单击 Jetpack Compose 时如何禁用涟漪效应

ImM*_*han 12 android android-jetpack android-jetpack-compose

在 Jetpack Compose 中,当您启用clickable {}可组合的修改器时,默认情况下它会为其启用涟漪效果。如何禁用此行为?

示例代码

Row(modifier = Modifier
         .clickable { // action }
)
Run Code Online (Sandbox Code Playgroud)

ImM*_*han 103

要禁用波纹效果,必须传递nullindication修改器的属性。

有关Jetpack Compose 文档中指示的更多信息

代码

Row(
    modifier = Modifier
        .clickable(
            indication = null, 
            interactionSource = remember { MutableInteractionSource() } // This is mandatory
        ) { 
            // action
        }
)
Run Code Online (Sandbox Code Playgroud)

  • 我相信参数“interactionSource”需要位于列表中“induction”参数之前。 (4认同)
  • @JonasVautherin 确保导入正确的可点击扩展 (4认同)
  • 我收到“找不到具有此名称的参数:指示”。我错过了什么吗? (2认同)

Fel*_*uki 19


使用按钮时可以这样处理。

创建Ripple 交互源

class NoRippleInteractionSource : MutableInteractionSource {

override val interactions: Flow<Interaction> = emptyFlow()

override suspend fun emit(interaction: Interaction) {}

override fun tryEmit(interaction: Interaction) = true

}
Run Code Online (Sandbox Code Playgroud)

如果是按钮,您可以通过将涟漪交互类作为交互源参数传递来处理它,即:

 Button(
    onClick = { /*...*/ },
    interactionSource = NoRippleInteractionSource()
) {
    //..
}
Run Code Online (Sandbox Code Playgroud)

此解决方案适用于所有接受 mutableInteractionSource 作为参数的可组合项,例如Button()TextButton()Switch()

当使用可点击修改器时,你可以这样做:

modifier = Modifier.clickable(
                    indication = null,
                    interactionSource = NoRippleInteractionSource()
                ) { /** todo  action here */ }
Run Code Online (Sandbox Code Playgroud)

您还可以进一步修改上述答案并创建扩展函数并重新用于所有可点击的函数,即:

fun Modifier.noRippleClick(onClick:()->Unit):Modifier {
  return this.clickable(
    interactionSource = NoRippleInteractionSource(),
    indication = null
   ){ 
      onClick() 
   } 
 }
Run Code Online (Sandbox Code Playgroud)

您现在可以使用扩展修饰符代替可单击修饰符,即:

modifier = modifier.noRippleClick { /** todo  action here */  }
Run Code Online (Sandbox Code Playgroud)


Gab*_*tti 18

如果您将clickable修饰符添加 到元素以使其在其边界内可点击,它将显示Indication指示参数中指定的 。

默认情况下,LocalIndication将使用指示 from 。

如果您在层次结构中使用 MaterialTheme,aRipple将用作Indication内部组件的默认值,例如androidx.compose.foundation.clickableandroidx.compose.foundation.indication

通过null显示无指示:

val interactionSource = remember { MutableInteractionSource() }
Column {
    Text(
        text = "Click me and my neighbour will indicate as well!",
        modifier = Modifier
            .clickable(
                interactionSource = interactionSource,
                indication = null
            ) {
                /* .... */
            }
    )
Run Code Online (Sandbox Code Playgroud)


Mah*_*alv 15

使用此修饰符扩展:

inline fun Modifier.noRippleClickable(crossinline onClick: ()->Unit): Modifier = composed {
    clickable(indication = null,
        interactionSource = remember { MutableInteractionSource() }) {
        onClick()
    }
}
Run Code Online (Sandbox Code Playgroud)

然后简单地替换Modifier.clickable {}Modifier.noRippleClickable {}

Row(modifier = Modifier.noRippleClickable { // action })
Run Code Online (Sandbox Code Playgroud)

  • 为“Modifier”扩展加 1。 (3认同)
  • Android Studio 显示警告“Unnecessary use of Modifier.composed”。这是错误还是可以通过其他方式创建? (2认同)