修改 Jetpack Compose 中 IconButton 的波纹颜色

时间:2021-04-26 10:54:43

标签: android android-jetpack-compose

如何更改 IconButton 的波纹颜色?

我试过这样做,但它没有改变:

IconButton(
        onClick = { onClick() },
        modifier = Modifier.clickable(
          onClick = { onClick() },
          indication = rememberRipple(color = MyCustomTheme.colors.primary),
          interactionSource =  remember { MutableInteractionSource() },
        )
      )

2 个答案:

答案 0 :(得分:2)

目前 (1.0.0-beta05) 您的代码不起作用,因为 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
        )
}

和:

CompositionLocalProvider(LocalRippleTheme provides  RippleCustomTheme) {
    IconButton(
        onClick = { },
    ) {
        Icon(Icons.Filled.Add, "")
    }
}

enter image description hereenter image description here

答案 1 :(得分:1)

我不知道您是否找到了一种方法使其适用于整个应用程序,但我找到了一种方法。所以我发布这个以防其他人有类似的问题。

您可以按照 Gabriele Mariotti 的回答所述设置自定义 RippleTheme 对象,然后您可以将 CompositionLocalProvider() 作为 MaterialTheme 中的内容传递。然后可以将应用 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()
    )
}

那么对于您的应用主题,它应该是:

@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
        )
    }
}

除非您明确将另一个 RippleTheme 直接设置为 AppTheme 层次结构下方的 Composables,否则此方法应该适用于整个应用程序。并且它与您可以直接设置为其他 ComposableLocalProvider 的其他类型的 Composables 值不冲突。