RippleTheme已弃用,如何设置按钮涟漪颜色为主题onSurface色?
如何在Compose Material-Ripple 1.7.0后设置特定按钮的涟漪颜色
问题背景
我的应用主题的primary颜色为绿色,按钮的涟漪效果默认使用该颜色。我希望某一特定按钮的涟漪效果使用主题的onSurface颜色,以匹配按钮的边框和文本颜色。此前通过LocalRippleTheme和RippleTheme实现该效果,代码如下:
CompositionLocalProvider(LocalRippleTheme provides MyRippleTheme) { OutlinedButton(border = BorderStroke(1.dp, MaterialTheme.colorScheme.onSurface)) { Text(color = MaterialTheme.colorScheme.onSurface) } } object MyRippleTheme : RippleTheme { @Composable override fun defaultColor() = RippleTheme.defaultRippleColor(MaterialTheme.colorScheme.onSurface, lightTheme = true) @Composable override fun rippleAlpha(): RippleAlpha = RippleTheme.defaultRippleAlpha(MaterialTheme.colorScheme.onSurface, lightTheme = true) }
在androidx.compose.material:material-ripple库1.7.0版本发布后,LocalRippleTheme和RippleTheme已被弃用,请问如何实现需求?
解决方案
在Material-Ripple 1.7.0及后续版本中,弃用了全局涟漪主题的配置方式,改为直接通过组件的ripple参数自定义涟漪效果。对于OutlinedButton这类Material 3组件,可以使用rememberRipple()方法创建自定义涟漪实例,指定目标颜色和透明度:
直接配置按钮涟漪
OutlinedButton( border = BorderStroke(1.dp, MaterialTheme.colorScheme.onSurface), ripple = rememberRipple( color = MaterialTheme.colorScheme.onSurface, alpha = RippleDefaults.alpha(MaterialTheme.colorScheme.onSurface, lightTheme = isSystemInDarkTheme().not()) ) ) { Text(color = MaterialTheme.colorScheme.onSurface) }
复用涟漪配置
如果需要在多个按钮中复用该涟漪效果,可以封装为可组合函数:
@Composable fun OnSurfaceRipple() = rememberRipple( color = MaterialTheme.colorScheme.onSurface, alpha = RippleDefaults.alpha(MaterialTheme.colorScheme.onSurface, lightTheme = isSystemInDarkTheme().not()) ) // 使用时 OutlinedButton( border = BorderStroke(1.dp, MaterialTheme.colorScheme.onSurface), ripple = OnSurfaceRipple() ) { Text(color = MaterialTheme.colorScheme.onSurface) }
关键说明
rememberRipple()用于创建并缓存涟漪配置,避免重复创建实例RippleDefaults.alpha()会根据主题明暗自动计算合适的涟漪透明度,逻辑与旧版RippleTheme.defaultRippleAlpha一致- 该方式直接作用于单个按钮,不会影响全局其他组件的涟漪效果
内容的提问来源于stack exchange,提问作者Adil Hussain
相关产品推荐
相关产品推荐

