Jetpack Compose では、clickable {}
コンポーザブルの修飾子を有効にすると、デフォルトでそのコンポーザブルの波及効果が有効になります。この動作を無効にするにはどうすればよいでしょうか?
サンプルコード
Row(modifier = Modifier
.clickable { // action }
)
ベストアンサー1
短い答え:
リップルパスを無効にするにnull
はindication
パラメータのclickable
修飾子:
val interactionSource = remember { MutableInteractionSource() }
Column {
Text(
text = "Click me without any ripple!",
modifier = Modifier
.clickable(
interactionSource = interactionSource,
indication = null
) {
/* doSomething() */
}
)
一部の Composable がボタンとして機能しない理由:
Button
やなどの一部の Composable では、が を使用するコンポーネントによって内部的に定義されているIconButton
ため、 は機能しないことに注意してください。これにより、 によって提供される値を使用して が作成され、記憶されます。indication
indication = rememberRipple()
Ripple
RippleTheme
この場合、無効にすることはできませんが、 に基づくリップルの外観を変更することはできますRippleTheme
。 カスタム RippleTheme を定義し、 を使用してそれをコンポーザブルに適用できますLocalRippleTheme
。
何かのようなもの:
CompositionLocalProvider(LocalRippleTheme provides NoRippleTheme) {
Button(
onClick = { /*...*/ },
) {
//...
}
}
と:
private object NoRippleTheme : RippleTheme {
@Composable
override fun defaultColor() = Color.Unspecified
@Composable
override fun rippleAlpha(): RippleAlpha = RippleAlpha(0.0f,0.0f,0.0f,0.0f)
}
カスタム修飾子
上記と同じコードを使用してカスタム Modifier を構築したい場合は、以下を使用できます。
fun Modifier.clickableWithoutRipple(
interactionSource: MutableInteractionSource,
onClick: () -> Unit
) = composed(
factory = {
this.then(
Modifier.clickable(
interactionSource = interactionSource,
indication = null,
onClick = { onClick() }
)
)
}
)
そしてそれを適用するだけです:
Row(
modifier = Modifier
.clickableWithoutRipple(
interactionSource = interactionSource,
onClick = { doSomething() }
)
){
//Row content
}
長い答え:
追加するとclickable
修飾子境界内でクリックできるようにコンポーザブルに追加すると、Indication
指示パラメータで指定されたとおり。
デフォルトでは、LocalIndication
使用されます。
MaterialTheme
階層内で を使用している場合、 は次Ripple
のように定義されます。rememberRipple()
は、やIndication
などのコンポーネント内ではデフォルトとして使用されます。androidx.compose.foundation.clickable
androidx.compose.foundation.indication