在Android5.0中新增了一种水波效果控件,叫RippleDrawable,当控件使用RippleDrawable作为背景(android:background)且在控件可以接受点击动作(android:clickable="true")的条件下,当按下或抬起手指时,会出现水波效果。效果如下图所示:
以上图片的layout代码如下:
ripple_bg.xml 内容如下:
以上的代码需要sdk版本为21的Eclipse或者Android Studio中编辑,并在Android5.0的虚拟机或真机上运行。
以下从源码的角度分析一下RippleDrawable的逻辑:
如下面的的时序图,以下将从4步简介按下时的效果:
Step 1:
RippleDrawable::onStateChange()
@Override
protected boolean onStateChange(int[] stateSet) {
final boolean changed = super.onStateChange(stateSet);
boolean enabled = false;
boolean pressed = false;
boolean focused = false;
for (int state : stateSet) {
if (state == R.attr.state_enabled) {
enabled = true;
}
if (state == R.attr.state_focused) {
focused = true;
}
if (state == R.attr.state_pressed) {
pressed = true;
}
}
setRippleActive(enabled && pressed);
setBackgroundActive(focused || (enabled && pressed));
return changed;
}
以上代码中,又调用了setRippleActive()方法
priva