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

Posted

技术标签:

【中文标题】在 Jetpack Compose 中单击时如何禁用涟漪效应【英文标题】:How to disable ripple effect when clicking in Jetpack Compose 【发布时间】:2021-06-16 13:59:53 【问题描述】:

在 Jetpack Compose 中,当您在可组合项的修饰符上启用 clickable 时,默认情况下会为其启用波纹效果。如何禁用此行为?

示例代码

Row(modifier = Modifier
         .clickable  // action 
)

【问题讨论】:

【参考方案1】:

简答: 在 clickable 修饰符的 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
            ) 
                /* .... */
            
    )

长答案: 如果您将 clickable modifier 添加到元素以使其在其边界内可点击,它将显示在指示参数中指定的 Indication

默认情况下,将使用来自LocalIndication 的指示。

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

【讨论】:

【参考方案2】:

使用这个修饰符扩展:

inline fun Modifier.noRippleClickable(crossinline onClick: ()->Unit): Modifier = composed 
    clickable(indication = null,
        interactionSource = remember  MutableInteractionSource() ) 
        onClick()
    

然后只需将Modifier.clickable 替换为Modifier.noRippleClickable

Row(modifier = Modifier.noRippleClickable  
  // action 
)

【讨论】:

Modifier 扩展加 1。 Android Studio 显示警告 Unnecessary use of Modifier.composed。这是错误还是可以以其他方式创建? @iknow 我不知道。在我写这个答案的时候没有任何警告。我会尽快看看。感谢您的通知。【参考方案3】:

要禁用波纹效果,必须将null 传递给修饰符的indication 属性。

更多关于Jetpack Compose documentation的指示

代码

Row(
    modifier = Modifier
        .clickable(
            indication = null, 
            interactionSource = remember  MutableInteractionSource()  // This is mandatory
        )  
            // action
        
)

【讨论】:

我收到“找不到具有此名称的参数:指示”。我错过了什么吗? 我认为参数interactionSource 需要在列表中的indication 参数之前。【参考方案4】:
 modifier = Modifier
        .clickable(
            enabled = enabled,
            onClick =  if (enabled) onClick() 
        )

如果您在 Column 或任何其他组件上使用修饰符可点击属性,那么您可以在需要时使用 enabled 属性和 onClick 来禁用涟漪效应。

【讨论】:

以上是关于在 Jetpack Compose 中单击时如何禁用涟漪效应的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时添加 texdfields 并在 android jetpack compose 中管理这些文本字段值?

Jetpack Compose,设置新数据时如何重置 LazyColumn 位置?

如何在Jetpack Compose中更改topBar对应的屏幕

如何在jetpack compose中设置抽屉的宽度>

尝试运行 jetpack compose 仪器测试时如何克服此构建错误

如何从 Jetpack Compose TextField 关闭虚拟键盘?