Pra*_* P. 4 android android-jetpack-compose android-jetpack-compose-button
如何更改 IconButton 的波纹颜色?
我尝试这样做,但它没有改变:
IconButton(
onClick = { onClick() },
modifier = Modifier.clickable(
onClick = { onClick() },
indication = rememberRipple(color = MyCustomTheme.colors.primary),
interactionSource = remember { MutableInteractionSource() },
)
)
Run Code Online (Sandbox Code Playgroud)
Gab*_*tti 23
您的代码不起作用,因为 Ripple 是.clickable在IconButton.
波纹的出现是基于RippleTheme. 您可以定义自定义RippleTheme并将其应用到您的可组合项中LocalRippleTheme。
就像是:
private object RippleCustomTheme: RippleTheme {
//Your custom implementation...
@Composable
override fun defaultColor() =
RippleTheme.defaultRippleColor(
Color.Red,
lightTheme = true
)
@Composable
override fun rippleAlpha(): RippleAlpha =
RippleTheme.defaultRippleAlpha(
Color.Black,
lightTheme = true
)
}
Run Code Online (Sandbox Code Playgroud)
和:
CompositionLocalProvider(LocalRippleTheme provides RippleCustomTheme) {
IconButton(
onClick = { },
) {
Icon(Icons.Filled.Add, "")
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
有点晚了,但也许这段代码会对某人有所帮助。
为了使您的代码正常工作,您还需要将交互源应用到按钮本身。
您可以通过这种方式在本地更改颜色。为了保持正确的按钮和波纹尺寸,在调用指示后应用高度非常重要。
此外,您需要应用任意大小的半径,以便将半径包含在按钮形状内部(这似乎是 Compose 1.2.0-rc03 中的一个错误)。
val interactionSource = remember { MutableInteractionSource() }
val rippleColor = Color.RED
val shape = RoundedCornerShape(size = 16.dp)
Button(
modifier = Modifier
.clip(shape = shape)
.indication(
interactionSource = interactionSource,
indication = rememberRipple(
color = rippleColor,
radius = 8.dp
)
)
.height(height = 40.dp),
shape = shape,
interactionSource = interactionSource,
)
Run Code Online (Sandbox Code Playgroud)
小智 5
我不知道您是否找到了一种方法使其适用于整个应用程序,但我找到了一种方法。所以我发布这个以防其他人有类似的问题。
您可以RippleTheme按照 Gabriele Mariotti 的回答所述设置自定义对象,然后您可以CompositionLocalProvider()在 MaterialTheme 中传递as 内容。theme然后可以将应用程序的内容设置为CompositionalLocalProvider().
看看这里:
private object JetNewsRippleTheme : RippleTheme {
// Here you should return the ripple color you want
// and not use the defaultRippleColor extension on RippleTheme.
// Using that will override the ripple color set in DarkMode
// or when you set light parameter to false
@Composable
override fun defaultColor(): Color = MaterialTheme.colors.primary
@Composable
override fun rippleAlpha(): RippleAlpha = RippleTheme.defaultRippleAlpha(
Color.Black,
lightTheme = !isSystemInDarkTheme()
)
}
Run Code Online (Sandbox Code Playgroud)
然后对于您的应用程序主题,它应该是:
@Composable
fun JetNewsTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit
) {
MaterialTheme(
colors = if (darkTheme) DarkColors else LightColors,
typography = JetNewsTypography,
shapes = JetNewsShapes
) {
CompositionLocalProvider(
LocalRippleTheme provides JetNewsRippleTheme,
content = content
)
}
}
Run Code Online (Sandbox Code Playgroud)
此方法应该适用于整个应用程序,除非您明确地将另一个RippleTheme直接设置为AppTheme层次结构下方的 Composables 。并且它与ComposableLocalProvider您可能直接设置为其他类型的值不冲突Composables。
如果您只需要在一处覆盖波纹颜色,您可以为其创建自己的修改器。
fun Modifier.clickable(
rippleColor: Color? = null,
onClick: () -> Unit
) = composed(
inspectorInfo = debugInspectorInfo {
name = "clickable"
properties["rippleColor"] = rippleColor
properties["onClick"] = onClick
}
) {
Modifier.clickable(
onClick = onClick,
indication = rippleColor?.let {
rememberRipple(
color = it
)
} ?: LocalIndication.current,
interactionSource = remember { MutableInteractionSource() }
)
}
Run Code Online (Sandbox Code Playgroud)