You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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参数的设计初衷是适配两种不同的波纹场景:
    1. 组件内的「边界型波纹」:比如按钮内部的波纹,从中心扩散且不超出按钮范围
    2. 全局的「触摸点波纹」:比如全屏触摸时的波纹,从触摸点出发可超出组件边界
  • 如果你希望波纹既从触摸点生成,又被限制在组件边界内,可以保留bounded = true,但这种场景下通常不建议手动指定radius,让系统自动计算更适配。

内容的提问来源于stack exchange,提问作者Thracian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:57:37