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);//分别解析两种颜色为colordrawbleColorDrawable drawableNormal = new ColorDrawable(normalColor);if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {//高版本设置RippleDrawable 而低版本设置 StateListDrawable也就是selectorColorStateList 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);//分别解析两种颜色为colordrawbleColorDrawable drawableNormal = new ColorDrawable(normalColor);if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {//高版本设置RippleDrawable 而低版本设置 StateListDrawable也就是selectorColorStateList 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下载

艺术般的波浪点击反馈效果相关推荐

  1. Vue组件设计 | 实现水波涟漪效果的点击反馈指令

    点击上方 前端瓶子君,关注公众号 回复算法,加入前端编程面试算法每日一题群 点击反馈 不知道小伙伴们有没有注意过这样一个细节,有的应用按钮,链接,可交互的卡片点击起来十分有感觉,而有的却像是点在白纸上 ...

  2. 【作业】{r} :Shiny app 中使用 isolate 函数,达到 app 作图变换时的不实时反馈效果

    作业要求: 在本节中, Shiny app 中使用 isolate 函数,达到 app 作图变换时的不实时反馈效果,即添加一个类似 " 刷新 "(refresh)按钮,实现每次图像 ...

  3. 6.Unity2D 横版 受击反馈+跟随血条+延时/延迟扣血+协程的应用

    总目录https://blog.csdn.net/qq_54263076/category_11900070.html?spm=1001.2014.3001.5482 1. 受击反馈 用 Unity ...

  4. html表格鼠标高亮行列,JS实现的表格行鼠标点击高亮效果代码

    本文实例讲述了JS实现的表格行鼠标点击高亮效果代码.分享给大家供大家参考,具体如下: 偶尔在看天天基金网净值公告时,从源代码里剥下的一段js代码,感觉比较实用,分享一下(仅IE有效) var high ...

  5. TextView SpannableString 使用之实现可点击超链接效果

    TextView SpannableString 使用之实现可点击超链接效果 如果看到这里说明你对 TextView 已经有了一定的了解,至少已经使用过该控件显示文字过.现在来实现一些复杂一点的效果. ...

  6. Android踩坑日记:点击变暗效果的ImageView实现原理

    很多时候我们使用ImagView显示图片,无论是Gilde,Fresco等图片显示框架,比如设置中心更换头像,网格相册点击预览,选择等情况,会遇到点击变暗的交互需求. 源码分析     我们想的办法是 ...

  7. 使用css实现点击切换效果

    使用css制作简单的点击切换效果,参考了以下教程:css实现的轮播和点击切换(无js版) 首先先制作一个容器,用来容纳所显示的内容: HTML代码: <html></html> ...

  8. android view 点击变暗,Android应用开发Android ImageView点击变暗效果

    本文将带你了解Android应用开发Android ImageView点击变暗效果,希望本文对大家学Android有所帮助. < 自定义ImageView: 在ImageView中setPres ...

  9. html叠加层,JavaScript实现多个重叠层点击切换效果的方法

    本文实例讲述了JavaScript实现多个重叠层点击切换效果的方法.分享给大家供大家参考.具体如下: /p> "http://www.w3.org/TR/xhtml1/DTD/xhtm ...

最新文章

  1. 杭电acm1004java答案_水过杭电OJ hdu1004
  2. iMeta:青岛大学苏晓泉组开发跨平台可交互的微生物组分析套件PMS(全文翻译,PPT,视频)...
  3. 服务器虚拟机密度,服务器整合:虚拟机密度大未必好事
  4. Android深入浅出系列之实例应用—手机页面之间的跳转
  5. ROS总结一,catkin,package,CMakeList,Topic,node
  6. 层次分析法matlab_建模开讲课程回放2:层次分析法及其MATLAB
  7. hdu 1203 I NEED A OFFER!
  8. 使用python批量验证邮箱密码_python(Django 网页登陆账号、密码、邮箱验证)
  9. 介绍一些有趣的MySQL pager命令
  10. 学生个人网页制作html代码
  11. c# 角度和弧度的转换
  12. 名人博客VS 博客名人
  13. Vue用图片制作Wifi动态图 制作小喇叭效果
  14. 【萌新向】STC8A8K64S4A12开发学习(一)——点亮LED
  15. 企业信息化:如何考虑企业信息化
  16. 利用插件修改wordpress文件上传限制
  17. 122. 买卖股票的最佳时机 II
  18. js实现web网页版台球游戏
  19. 二分类交叉熵损失函数python_【深度学习基础】第二课:softmax分类器和交叉熵损失函数...
  20. 矿区无人值守称重系统流程怎么设计才合理

热门文章

  1. 如何設計框架(Framework)的API呢?
  2. 火影手游为什么服务器维护,火影忍者手游安装失败解决方法 游戏闪退进不去怎么办...
  3. 计算机辅助设计教学视频,计算机辅助设计(二维平面)
  4. 毕业季--Java基础面试题
  5. 内存马查杀copagent研究
  6. 使用Zxing玩转二维码白边的各个花样
  7. Failed to extend swap file from 0 kb to xxx kb.
  8. 阿里开源低代码引擎LowCodeEngine
  9. Java的object如何转为map_java实现Object和Map之间的转换3种方式
  10. 新媒体运营胡耀文教程:直播间10大话术总结,互动话术不冷场