Jetpack Compose中使用pointerInput显示触摸位置波纹时,设置radius后波纹不扩散且位置异常问题
问题原因分析
这个问题我之前也碰到过,根源在于rememberRipple的bounded参数默认行为!
当你手动给rememberRipple指定radius参数时,它的bounded参数会默认被设置为true。这个参数的作用是:
- 当
bounded = true时,波纹会被限制在Composable的边界范围内,并且固定从组件中心生成,而不是你的触摸位置。 - 而当你不指定
radius时,bounded默认是false,这时候波纹会从触摸点开始正常向外扩散,也不会被组件边界限制。
解决方案
只需要在rememberRipple里显式设置bounded = false,就能让指定了radius的波纹也从触摸位置生成并正常扩散:
val interactionSource = remember { MutableInteractionSource() } val pointerModifier = Modifier .fillMaxSize() // 显式添加bounded = false参数 .indication(interactionSource, rememberRipple(color = Color.Red, radius = 50.dp, bounded = false)) .pointerInput(Unit) { detectTapGestures( onPress = { offset: Offset -> val press = PressInteraction.Press(offset) interactionSource.emit(press) // 等待按压释放后再返回。如果按压已释放则返回true,若手势被其他手势取消则返回false。 tryAwaitRelease() // 在此发送释放按压交互事件 interactionSource.emit(PressInteraction.Release(press)) } ) } Box(modifier = pointerModifier)
补充说明
bounded参数的设计初衷是适配两种不同的波纹场景:- 组件内的「边界型波纹」:比如按钮内部的波纹,从中心扩散且不超出按钮范围
- 全局的「触摸点波纹」:比如全屏触摸时的波纹,从触摸点出发可超出组件边界
- 如果你希望波纹既从触摸点生成,又被限制在组件边界内,可以保留
bounded = true,但这种场景下通常不建议手动指定radius,让系统自动计算更适配。
内容的提问来源于stack exchange,提问作者Thracian
相关产品推荐
相关产品推荐

