艺术般的波浪点击反馈效果

Posted 思忆(GeorgeQin)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了艺术般的波浪点击反馈效果相关的知识,希望对你有一定的参考价值。

Material Design之Rippledrawable 使用与简单封装(向下兼容至selector)

  • 前言
    android 5.0问世以来,谷歌所推崇的Material Design得到业界的一致好评,其良好的UI规范与交互确实让界面交互友好和漂亮了不少,Rippledrawable便是其中之一,本博客今天着重讲如何将它运用到我们自己的项目中,并且封装得简单易用。

我们都知道,我们在之前做按钮或者布局的反馈效果,一般都用selector来实现,分别指定按下或正常状态的两种颜色即可,我们点击的效果也本质上就是颜色的改变而已,而Rippledrawable则不同,它能将我们指定的颜色产生一个渐变的动画过程,并且看上去像是一滴水滴在水面上的涟漪效果,看上去非常赏心悦目,效果如下:

非常炫有木有!当然要把它用到我们的项目里面来!
下面我们来看看简单用法:
首先rippledrawble 是5.0以后才出的类,因此会有兼容性(文章后面会解决这个问题)所以我们需要在系统资源文件下新建一个drwable-v21的文件夹:

然后我们在里面新建一个selector_item.xml的文件(名称随意~)

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#D3D3D3">
    <item android:drawable="@android:color/white" />
</ripple>
然后在我们需要的view中setbackground即可~ 但是低于5.0一下的版本不就没有点击效果了嘛?所以我们还要按照我们指定的这两种颜色去写一个selector,低版本才能有点击效果~ so 来到我们熟悉的selector~
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/colorgray" android:state_pressed="true" />
    <item android:drawable="@color/colorwhite" android:state_pressed="false" />
</selector>
设置给view~ ![](https://img-blog.csdn.net/20160723222159741) 效果对比~ ![](https://img-blog.csdn.net/20160723222231445) 左边的效果就是我们5.0一下的点击效果,而右边就是我们的新的交互效果,这样一来,既往下兼容了点击效果,又保证了高于5.0的系统有更好的交互体验,何乐而不为呐?
  • 拓展

但是上面的实现方式似乎不太灵活,也很麻烦,为了实现一个点击效果,我们要新建一个文件夹,还要额外写两个点击效果的文件,是不是太烦了?so 我们直接用代码实现我们上面繁琐的过程~
首先贴下实现效果:

5.0以上的系统:

5.0以下的系统:

很方便有木有!不需要额外创建文件啥的,我们一行代码指定我们所需要的颜色指定给需要设定的view即可!
代码如下:

/**
     *为单个view设置点击效果,高版本带涟漪反馈
     * @param normalColor 未点击的颜色
     * @param pressColor  按下的颜色
     * @param view  目标view
     */
    public static void setOnclickfeedBack(int normalColor, int pressColor, View view) 
        Drawable bgDrawble;
        ColorDrawable drawablePressed = new ColorDrawable(pressColor);//分别解析两种颜色为colordrawble
        ColorDrawable drawableNormal = new ColorDrawable(normalColor);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) //高版本设置RippleDrawable 而低版本设置 StateListDrawable也就是selector
            ColorStateList stateList = ColorStateList.valueOf(pressColor);
            RippleDrawable rippleDrawable = new RippleDrawable(stateList, drawableNormal, drawablePressed);
            bgDrawble = rippleDrawable;
         else 
            StateListDrawable stateListDrawable = new StateListDrawable();
            stateListDrawable.addState(new int[]android.R.attr.state_pressed, drawablePressed);
            stateListDrawable.addState(new int[]-android.R.attr.state_pressed, drawableNormal);
            bgDrawble = stateListDrawable;
        
        view.setBackgroundDrawable(bgDrawble);//最终设置给我们的view作为背景
    

思路很简单,我们就是设定两个颜色和目标view,根据系统sdk版本来对应为view设置不同的Drawble背景高于5.0的我们生成RippleDrawable低版本我们用selector~
如果我们要设置多个view,我们再进一步封装这个方法:

  /**
     *支持同时设置多个view
     * @param normalColor
     * @param pressColor
     * @param views 目标view群
     */
    public static void setOnclickfeedBack(int normalColor, int pressColor, View... views) 
        for (int i = 0, size = views.length; i < size; i++) 
            View view = views[i];
            setOnclickfeedBack(normalColor, pressColor, view);
        
    

设置了个可变参数,想传几个view就几个,现在用起来就很简单了~

  FeedBackUtils.setOnclickfeedBack(Color.WHITE, Color.GRAY, vFeed2, vFeed3);

vFeed2,vFeed3就是我们demo里面变色的那两个view~
到这里大功告成,一句代码,轻松实现~

完整工具类

/**
 * Created by soulqw on 16/7/18.
 */
public class FeedBackUtils 
    /**
     *为单个view设置点击效果,高版本带涟漪反馈
     * @param normalColor 未点击的颜色
     * @param pressColor  按下的颜色
     * @param view  目标view
     */
    public static void setOnclickfeedBack(int normalColor, int pressColor, View view) 
        Drawable bgDrawble;
        ColorDrawable drawablePressed = new ColorDrawable(pressColor);//分别解析两种颜色为colordrawble
        ColorDrawable drawableNormal = new ColorDrawable(normalColor);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) //高版本设置RippleDrawable 而低版本设置 StateListDrawable也就是selector
            ColorStateList stateList = ColorStateList.valueOf(pressColor);
            RippleDrawable rippleDrawable = new RippleDrawable(stateList, drawableNormal, drawablePressed);
            bgDrawble = rippleDrawable;
         else 
            StateListDrawable stateListDrawable = new StateListDrawable();
            stateListDrawable.addState(new int[]android.R.attr.state_pressed, drawablePressed);
            stateListDrawable.addState(new int[]-android.R.attr.state_pressed, drawableNormal);
            bgDrawble = stateListDrawable;
        
        view.setBackgroundDrawable(bgDrawble);//最终设置给我们的view作为背景
    

    /**
     *支持同时设置多个view
     * @param normalColor
     * @param pressColor
     * @param views 目标view群
     */
    public static void setOnclickfeedBack(int normalColor, int pressColor, View... views) 
        for (int i = 0, size = views.length; i < size; i++) 
            View view = views[i];
            setOnclickfeedBack(normalColor, pressColor, view);
        
    
  • 拓展

    其实RippleDrawable除了单一颜色之外还支持item中加入图片,并且支持图片渐隐还有无边际的波浪效果等等,大家有兴趣可以多玩一玩,demo里面有简单配置,今天主要是抽取其可能最通用的场景,有啥问题欢迎大家反馈~

demo下载

以上是关于艺术般的波浪点击反馈效果的主要内容,如果未能解决你的问题,请参考以下文章

Recyclerview项目点击涟漪效果[重复]

在 Android 和 iOS 上点击自定义按钮时,实现“突出显示效果”而不是“涟漪效果”

前端例程20220728:按钮点击涟漪效果

realflow2013中文版

求ae做水滴入水后水波荡漾的效果。

怎么用vue实现点击图片(按钮)的波纹效果(涟漪动效)