触摸反馈在用户和UI元素交互的点提供瞬时视觉确认。例如,当按钮被触摸时显示一个水波纹效果。 这是 Android 5.0 默认的触摸反馈动画。
下图就是一个按钮默认的触摸反馈动画--水波纹动画
19.gif
(1)系统自带的两个 Ripple 波纹效果
//有边界
?android:attr/selectableItemBackground
//无边界 (要求API21以上)
?android:attr/selectableItemBackgroundBorderless
使用时只需要把上面这两个值作为 View 的 android:background="" 或 android:foreground="" 即可(如果已经有背景, 可以设置到前景属性中)。同时如果想要效果显示出来要保证 View 是可点击的(比如控件本身可点击、或者给控件设置点击事件、 或给控件设置 android:clickable="true")。
动画的颜色是系统默认的,您可以手动去设置这个颜色值,只需要在AppTheme添加如下属性即可:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:colorControlHighlight">#B8BD8B</item>
</style>
效果如下:
20.gif
(2)自定义 Ripple 波纹效果
[无边界]
在drawable中添加ripple_ani.xml文件
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:radius="50dp"
android:color="#4285f4">
</ripple>
在按钮中设置背景:
<Button
android:id="@+id/bt_recycleview"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:textSize="14sp"
android:background="@drawable/ripple_ani"
android:layout_centerHorizontal="true"
android:text="111"/>
ripple只能运用于Android5.0之后的版本,所以还请在drawable-v21中做适配
图片.png
效果如下:
21.gif
上图是没有边界的效果,无边界的ripple会覆盖按钮原本的背景颜色,所以上图是看不到按钮的背景色的,那么为ripple添加边界的效果是怎样的呢?
[有边界]
在布局中添加边界
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:radius="50dp"
android:color="#4285f4">
<!-- 添加边界 -->
<item android:drawable="@color/colorPrimary"/>
</ripple>
效果如下:
22.gif
(3)结合selector
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:radius="50dp"
android:color="#4285f4">
<!-- 添加边界 -->
<item>
<selector>
<item
android:drawable="@color/bt_1"
android:state_pressed="true">
</item>
<item
android:drawable="@color/bt_2"
android:state_pressed="false">
</item>
</selector>
</item>
</ripple>
效果如下:
23.gif
(4)结合shape
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:radius="50dp"
android:color="#4285f4">
<!-- 添加边界 -->
<item>
<shape android:shape="rectangle">
<corners android:radius="20dp"/>
<solid android:color="@color/bt_2"/>
</shape>
</item>
</ripple>
效果如下:
24.gif
(5)注意点
ripple是在Android5.0之后才有的,我们需要做一下兼容
就拿第四点来举例。
在drawable-v21目录下新建文件ripple_ani.xml,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:radius="50dp"
android:color="#4285f4">
<!-- 添加边界 -->
<item>
<shape android:shape="rectangle">
<corners android:radius="20dp"/>
<solid android:color="@color/bt_2"/>
</shape>
</item>
</ripple>
在drawable目录下新建文件ripple_ani.xml,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="20dp"/>
<solid android:color="@color/bt_2"/>
</shape>
参考
https://github.com/OCNYang/Android-Animation-Set/tree/master/ripple-animation
[本章完...]