RippleDrawable

在 Android 5.0(API 级别 21)中使用材质设计引入了波纹触摸效果,并且动画由新的 RippleDrawable 类实现。

Drawable 显示响应状态变化的连锁反应。可以通过使用相应的状态属性标识符调用 setHotspot(float x, float y) 来指定给定状态的纹波的锚定位置。

Version >= 5

通常,常规按钮的涟漪效果默认在 API 21 及更高版本中有效,对于其他可触摸视图,可以通过指定:

android:background="?android:attr/selectableItemBackground">

对于视图中包含的涟漪或:

android:background="?android:attr/selectableItemBackgroundBorderless"

对于超出视图范围的涟漪。

例如,在下图中,

  • B1 是一个没有任何背景的按钮,
  • B2 设置为 android:background="android:attr/selectableItemBackground"
  • B3 与 android:background="android:attr/selectableItemBackgroundBorderless" 一起设置

(图片提供: http//blog.csdn.net/a396901990/article/details/40187203

你可以使用以下代码实现相同的功能:

int[] attrs = new int[]{R.attr.selectableItemBackground};
TypedArray typedArray = getActivity().obtainStyledAttributes(attrs);
int backgroundResource = typedArray.getResourceId(0, 0);
myView.setBackgroundResource(backgroundResource);

也可以使用 android:foreground 属性以与上面相同的方式将涟漪添加到视图中。顾名思义,如果将纹波添加到前景,则纹波将显示在添加到其上的任何视图的上方(例如,ImageView,包含多个视图的 LinearLayout 等)。

如果要将涟漪效果自定义到视图中,则需要在 drawable 目录中创建新的 XML 文件。

以下是一些例子:

例 1 :无界波纹

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#ffff0000" />

示例 2 :具有蒙版和背景颜色的波纹

<ripple android:color="#7777777"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/mask"
        android:drawable="#ffff00" />
    <item android:drawable="@android:color/white"/>
</ripple>

如果 view 的背景已经指定shapecorners 和任何其他标签,要为该视图添加纹波,请使用 mask layer 并将纹波设置为视图的背景。

示例

 <?xml version="1.0" encoding="utf-8"?>
    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?android:attr/colorControlHighlight">
        <item android:id="@android:id/mask">
           <shape 
              android:shape="rectangle">
              solid android:color="#000000"/>
               <corners
                 android:radius="25dp"/>
            </shape>
        </item>
        <item android:drawable="@drawable/rounded_corners" />
    </ripple>

示例 3 :可绘制资源顶部的波纹

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#ff0000ff">
    <item android:drawable="@drawable/my_drawable" />
</ripple>

用法: 要将 ripple xml 文件附加到任何视图,请将其设置为背景,如下所示(假设你的 ripple 文件名为 my_ripple.xml):

<View 
    android:id="@+id/myViewId"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/my_ripple" />

选择:

如果你的目标版本是 v21 或更高版本(也可以将纹波选择器放在 drawable-v21 文件夹中),也可以使用纹波 drawable 代替颜色状态列表选择器:

<!-- /drawable/button.xml: -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/button_pressed"/>
    <item android:drawable="@drawable/button_normal"/>
</selector>

<!--/drawable-v21/button.xml:-->
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:colorControlHighlight">
   <item android:drawable="@drawable/button_normal" />
</ripple>

在这种情况下,视图的默认状态的颜色将为白色,按下的状态将显示可绘制的波纹。

注意: 使用 ?android:colorControlHighlight 会使涟漪与应用中的内置涟漪颜色相同。

要仅改变波纹颜色,你可以在主题中自定义颜色 android:colorControlHighlight,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar">
    <item name="android:colorControlHighlight">@color/your_custom_color</item>
  </style>

</resources>

然后在你的活动等中使用这个主题。效果如下图所示:

(图片提供: http//blog.csdn.net/a396901990/article/details/40187203