当前位置:首页 > 云服务器 > 正文

Android波纹扩散效果如何实现,有哪些代码示例?

什么是波纹扩散效果

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波纹扩散效果如何实现,有哪些代码示例? 第1张

  • 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:如何让波纹效果仅显示在按钮的圆角矩形内,而不是裁切成圆形?

Android波纹扩散效果如何实现,有哪些代码示例? 第2张

Android波纹扩散效果如何实现,有哪些代码示例? 第3张

解答:在 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() 自定义时长。

0