[英]How to disable ripple effect when clicking in Jetpack Compose
在 Jetpack Compose 中,当您在可组合项的修饰符上启用clickable {}
时,默认情况下会为其启用涟漪效应。 如何禁用此行为?
示例代码
Row(modifier = Modifier
.clickable { // action }
)
简短的回答:
在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
修饰符添加到元素以使其在其边界内可点击,它将显示Indication
参数中指定的指示。
默认情况下,将使用来自LocalIndication
的指示。
如果您在层次结构中使用MaterialTheme
, Ripple
将用作组件内部的默认Indication
,例如androidx.compose.foundation.clickable
和androidx.compose.foundation.indication
。
使用此修饰符扩展:
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
})
要禁用波纹效果,必须将null
传递给修饰符的indication
属性。
有关Jetpack Compose 文档中的指示的更多信息
代码
Row(
modifier = Modifier
.clickable(
indication = null,
interactionSource = remember { MutableInteractionSource() } // This is mandatory
) {
// action
}
)
带有其他参数的修饰符扩展:
inline fun Modifier.noRippleClickable(
enabled: Boolean = true,
onClickLabel: String? = null,
role: Role? = null,
crossinline onClick: ()->Unit
): Modifier = composed {
clickable(
enabled = enabled,
indication = null,
onClickLabel = onClickLabel,
role = role,
interactionSource = remember { MutableInteractionSource() }) {
onClick()
}
}
我使用@Mahdi-Malv 的答案并修改如下:
fun Modifier.noRippleClickable( interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, indication: Indication? = null, enabled: Boolean = true, onClickLabel: String? = null, role: Role? = null, onClick: () -> Unit, ) = clickable( interactionSource = interactionSource, indication = indication, enabled = enabled, onClickLabel = onClickLabel, role = role, onClick = onClick, )
使用 Buttons 时可以这样处理。
创建Ripple 交互源 class
class NoRippleInteractionSource : MutableInteractionSource {
override val interactions: Flow<Interaction> = emptyFlow()
override suspend fun emit(interaction: Interaction) {}
override fun tryEmit(interaction: Interaction) = true
}
如果是按钮,您可以通过将涟漪交互 class 作为interactionSource参数传递来处理它,即:
Button(
onClick = { /*...*/ },
interactionSource = NoRippleInteractionSource()
) {
//..
}
该解决方案适用于接受 mutableInteractionSource 作为参数的所有可组合项,例如Button() 、 TextButton() 、 Switch()等
modifier = Modifier
.clickable(
enabled = enabled,
onClick = { if (enabled) onClick() }
)
如果您在 Column 或任何其他组件上使用修饰符可单击属性,则可以在需要时使用 enabled 属性和 onClick 来禁用涟漪效应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.