Google 在Android 5.0时代推出了Material Design设计风格, 其中包含水波纹涟漪效果, 虽然已经过去号几年了, 但我觉得还是有必要聊聊这个, 本文偏向于无界水波纹的实现, 主要起到抛砖引玉的作用, 不会写得太复杂
系统水波纹
咱们先来看一个演示,如上图, 是系统的水波纹点击效果,通过以下代码为TextView添加的点击效果:
<TextView
android:id="@+id/tv_system"
android:background="?android:attr/selectableItemBackground"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center"
android:text="系统水波纹效果" />
代码很简单,就是给TextView加了一个背景,而这个背景其实就是一个 ripple 标签的Drawable, 如下代码也能创建一个系统的水波纹效果,ripple
标签对应RippleDrawable
,系统的水波纹都是在这个类里实现的。
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/item_hover">
<item
android:id="@android:id/mask"
android:drawable="@android:color/white"/>
<item>
<shape android:shape="rectangle">
<solid android:color="@color/transparent"/>
</shape>
</item>
</ripple>
问题思考
既然是自定义 Drawable
实现,那么有如下问题需要解答:
- 在
Drawable
里怎么监听用户点击事件? 难道要外部调用吗? 系统可没有这么干 - 怎么监听点击的位置? (明显系统的效果是从点击位置开始扩散的)
- 水波纹效果分析, 包含哪些动画?
通过阅读系统的 RippleDrawable
源码,我获得了以上问题的答案,大家请不要急,一步一步的来。
开始写代码
既然要自定义 Drawable 实现, 我创建了类 CustomRippleDrawable
,继承 Drawable, 重写4个必须重写的方法,再MainActivity
中添加一个TextView, 设置点击事件和背景:CustomRippleDrawable
, 准备工作就完成了。
<TextView
android:id="@+id/tv_cus