内容提要
在 Jetpack Compose 中,可以通过将 Modifier.clickable 的 indication 参数设置为 null 来去除 Material 包控件的点击水波纹效果。如果需要全局生效,可以在根组合项或主题中替换 LocalIndication。自定义 Indication 需要实现两个接口,步骤包括定义 NoIndication 对象并在主题中提供,以灵活控制点击效果。
延伸解读
局部去除水波纹的适用场景
将 Modifier.clickable 的 indication 参数设为 null 即可去除单个控件的点击水波纹。这种方式适合只希望特定按钮或卡片无涟漪效果,而不影响其他 Material 控件的场景。由于 clickable 的 indication 参数类型为 Indication?,传入 null 后不会绘制任何指示效果,但点击事件本身仍正常触发。
全局替换 LocalIndication 的两种范围
若想全局去除水波纹,可替换 LocalIndication。文章指出,在 Activity 的根组合项中替换,则只对该 Activity 生效;在主题中替换,则对整个应用生效。LocalIndication 默认值为 DefaultDebugIndication,通过 CompositionLocal 向下传递,因此上层替换后,下层所有使用默认 indication 的 clickable 都会受影响。
自定义 Indication 的实现要点
自定义 Indication 需要实现两个接口:Indication 和 IndicationInstance。Indication 中的 rememberUpdatedInstance 负责根据 InteractionSource 返回一个 IndicationInstance;IndicationInstance 中的 drawIndication 则决定如何绘制点击反馈。文章示例中的 NoIndication 在 drawIndication 里只调用 drawContent(),不绘制任何额外内容,从而实现
从去除到自定义的扩展思路
文章提到,理解 Indication 和 IndicationInstance 两个接口后,完全可以自定义想要的点击效果。默认的 DefaultDebugIndication 会根据按压、悬停、聚焦状态绘制不同透明度的黑色矩形。读者可参考这一逻辑,在 drawIndication 中按状态绘制自定义图形或颜色,从而替代水波纹,但需注意保持与交互状态同步。
Q&A
如何在 Jetpack Compose 中去除点击水波纹效果?
可以通过将 Modifier.clickable 的 indication 参数设置为 null 来去除水波纹效果。
如果想要全局去除水波纹效果,该怎么做?
可以在根组合项或主题中替换 LocalIndication 来全局去除水波纹效果。
自定义 Indication 需要实现哪些接口?
自定义 Indication 需要实现 Indication 和 IndicationInstance 两个接口。
如何定义一个 NoIndication 对象?
可以通过实现 Indication 接口并定义一个 NoIndicationInstance 来创建 NoIndication 对象。
在 Jetpack Compose 中,水波纹效果的默认实现是什么?
默认的水波纹效果通过 DefaultDebugIndication 实现,包含对按压、悬停和聚焦状态的处理。
如何在主题中提供自定义的点击效果?
可以在 MaterialTheme 中使用 CompositionLocalProvider 替换 LocalIndication 来提供自定义点击效果。