Android波纹扩散效果如何实现,有哪些代码示例?
- 云服务器
- 2026-07-25
- 7
什么是波纹扩散效果
Android 中的波纹扩散效果(Ripple Effect)是 Material Design 中用于触摸反馈的标准视觉动画,当用户触摸按钮、列表项等交互元素时,从触摸点发出一圈圆形波纹,逐渐向外扩散并淡出,提示用户操作已触发,该效果由 RippleDrawable 实现,支持自定义颜色、形状、边界以及动画行为。
实现方式
使用系统预置的波纹样式
在布局 XML 中,为 View 设置背景即可快速启用波纹反馈:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="点我" android:background="?attr/selectableItemBackground" />
- ?attr/selectableItemBackground:默认灰色波纹,带圆形扩散效果。
- ?attr/selectableItemBackgroundBorderless:无边界的波纹,扩散范围超出 View 本身,适合图标按钮。
自定义 RippleDrawable(XML)
通过 <ripple> 标签定义波纹颜色、内容层及遮罩,精细控制视觉效果:

- android:color:波纹颜色。
- <item android:id="@android:id/mask">:定义遮罩,波纹只在此形状内显示。
- 其他 item:作为普通状态的前景或背景。
代码中动态设置/控制
// 方法一:通过资源 ID 获取 RippleDrawable RippleDrawable ripple = (RippleDrawable) ContextCompat.getDrawable(context, R.drawable.my_ripple); view.setBackground(ripple); // 方法二:使用 setHotspot() 控制波纹起始点 view.setOnTouchListener((v, event) -> { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { // 设置热点(触摸点) v.setHotspot(event.getX(), event.getY()); } return false; });
自定义属性详解
| 属性/标签 | 作用 | 示例值 |
|---|---|---|
| android:color | 波纹颜色(支持状态列表) | #FF6200EE |
| android:radius | 波纹最大半径(默认自动扩展) | 100dp |
| <item android:drawable> | 内容层(普通状态背景) | 形状、颜色、图片 |
| <item android:id="@android:id/mask"> | 遮罩层,限制波纹显示区域 | 必须包含形状,否则无效 |
| android:exitFadeDuration | 释放触摸后波纹淡出时间 | 200(毫秒) |
适配与兼容性
- Android 5.0(API 21)及以上原生支持 RippleDrawable。
- 低版本使用 AndroidX AppCompat 的 ViewCompat 或第三方库(如 Material Components 库)实现类似效果。
- 通过 android:backgroundTint 可快速改变按钮等控件的波纹颜色,无需自定义 drawable。
相关问题与解答
问题1:如何让波纹效果仅显示在按钮的圆角矩形内,而不是裁切成圆形?


解答:在 ripple 标签内部添加一个 <item android:id="@android:id/mask">,并在其中定义一个与按钮形状相同的 <shape>(如圆角矩形),遮罩层会强制波纹只在形状内部扩散,不会超出边界。
<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="#FF6200EE"> <item android:id="@android:id/mask"> <shape android:shape="rectangle"> <solid android:color="#FFFFFF" /> <corners android:radius="16dp" /> </shape> </item> <item android:drawable="@drawable/btn_bg" /> </ripple>
问题2:波纹扩散动画的持续时间可以调整吗?我想让波纹扩散得更慢或更快。
解答:可以,RippleDrawable 的扩散动画时间由系统主题控制,默认为约 300ms,若需自定义,可通过两种方式:
- 代码中设置:获取 RippleDrawable 对象后,调用 setRadius() 和 setColor() 等相关方法,或使用 RippleDrawable 的 setEnterFadeDuration() 和 setExitFadeDuration() 分别设置触摸按下的淡入时间(扩散速度)和释放后的淡出时间,但注意,这些方法仅在 API 21+ 可用。
- 自定义动画替代:完全放弃 RippleDrawable,改用 Animation 或 Animator 实现圆形扩散效果,这样可精确控制插值器、时长和半径变化曲线,例如使用 ViewAnimationUtils.createCircularReveal()(API 21+)实现波纹扩散,并设置 setDuration() 自定义时长。