Android L限制Ripple水波纹范围大小

Ripple 简介

Android 5.0 之后 google 推出了 Material Design,Botton 默认的触摸反馈会有水波纹涟漪效果。而这种水波纹的效果实现主要依赖于。

以下会介绍 Ripple 的基本使用及关于控制水波纹范围的三种处理方法,仅作点明思路及学习笔记不作具体实现。

基本使用

该效果通常以 background 的形式呈现,在 XML 中可以引用以下两个系统自带属性:

- android:background="?android:attr/selectableItemBackground" 有边界波纹

- android:background="?android:attr/··" 超出边界波纹。该波纹由父布局绘制及限制边界 (API 21 提供)

以selectableItemBackground为例看下系统属性的实现原理,发现该属性的定义最终指向 @drawable/item_background_material,

查看该 Drawable 文件内容为:

android:color="?attr/colorControlHighlight">

selectableItemBackgroundBorderless 所对应 Drawable 内容为:"http://schemas.android.com/apk/res/android"android:color="?attr/colorControlHighlight"/>

XML 控制

特点:简单,用于固定的 view 的处理,但灵活性不高。

目前网络上的资料偏向于如何在 xml 的 item 下做文章,如在 ripple 中添加 shape 来限制范围,验证效果反而有各种小坑 (谁验谁知道)。殊不知官方早已提供解决方案。"http://schemas.android.com/apk/res/android"

android:color="?android:attr/colorControlHighlight"

android:radius="@dimen/ripple_radius"/>

自定义 RippleDrawable

特点:可以动态控制,灵活性超级高,但对应的处理复杂度和难度也较高。

设置水波纹点击效果的本质其实就是设置一个 background,最为灵活的方法当然是自定义 ripple,然后对目标 View 直接 setBackground 即可.

RippleDrawable 继承于 Drawable

自定义时可以继承 RippleDrawable 也可以直接继承 Drawable,两者的本质分别是实现setRadius()和实现 setHotspotBounds(),殊途同归,均可以达到动态限制波纹大小的效果。系统的虚拟键 NavigationBar 就是使用的后者。

折中方案

特点:简单,灵活适中,易上手

以selectableItemBackgroundBorderless超出边界范围为基础,以 setHotspotBounds()的方式动态控制其波纹范围。

以下提供的是个简易工具 demo,调用时传入对应的 viewxxx.setBackground(RippleUtils.getRippleDrawable(context,targetView)),也可以自己定义增加一个控制 ripple 范围的方法:/**

* Created by vito on 16-11-1.

*/

publicclassRippleUtils{

privatestaticRippleDrawablemRipple;

privatestaticDrawablemTileBackground;

privatestaticDrawablenewTileBackground(Contextcontext){

finalint[]attrs=newint[]{

android.R.attr.selectableItemBackgroundBorderless

};

finalTypedArrayta=context.obtainStyledAttributes(attrs);

finalDrawabled=ta.getDrawable(0);

ta.recycle();

returnd;

}

privatestaticvoidsetRipple(RippleDrawabletileBackground,Viewv){

mRipple=tileBackground;

updateRippleSize(v);

}

//以view的中心为圆心,宽的1/4为半径的ripple范围

privatestaticvoidupdateRippleSize(Viewv){

// center the touch feedback on the center of the icon, and dial it down a bit

if(v.getWidth()!=0){

finalintcx=v.getWidth()/2;

finalintcy=v.getHeight()/2;

finalintrad=(int)(v.getWidth()*.25f);

Log.d("ripple","updateRippleSize: rad="+rad);

mRipple.setHotspotBounds(cx-rad,cy-rad,cx+rad,cy+rad);

}else{

// TODO: 17-1-9

}

}

//对外接口

publicstaticRippleDrawablegetRippleDrawable(Contextcontext,Viewview){

mTileBackground=newTileBackground(context);

if(mTileBackgroundinstanceofRippleDrawable){

setRipple((RippleDrawable)mTileBackground,view);

}

returnmRipple;

}

}

来源:

android ripple 大小,Android L限制Ripple水波纹范围大小相关推荐

  1. Android: Jetpack Compose如何禁用涟漪(水波纹)效果

    系列文章目录 Android: Jetpack Compose如何禁用涟漪(水波纹)效果 Android:使用Jetpack Compose 实现Text控件跑马灯效果 Android:使用Jetpa ...

  2. Android Material Design 之 Activity 跳转水波纹扩散动画

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  3. Android view.settran,Android RecyclerView从入门到玩坏

    目录 前言 基础使用 分隔线 点击监听 搭配CardView 更丰富的条目 增删条目 快速添加视图 让RecyclerView支持复杂视图 最后前言 RecyclerView在Android界面开发当 ...

  4. 去除安卓点击的水波纹效果

    在引用了appcompat_v7包后,Android Studio主题样式Base application theme会自动引用最新的主题样式Theme.AppCompat.Light:sdk21版本 ...

  5. css+js实现水波纹效果

    效果如下 新建HTML文件,把下面的代码直接贴进来,浏览器打开看效果. 在线运行 <!DOCTYPE html> <html lang="en"> < ...

  6. Android 水波纹点击效果(Ripple Effect)

    本文介绍的是Android5.0中其中一个炫酷的效果,点击水波纹扩散效果(Ripple Effect). 以下介绍的实现方式都是调用Android5.0的新API,并非自定义实现,所以只支持在Andr ...

  7. Android TabLayout选项卡点击选中Ripple水波纹

    Android TabLayout选项卡点击时候选中的Ripple水波纹 如果要实现自定义的TabLayout选项卡被点击选中时候的水波纹效果,要从xml属性定义中的: app:tabBackgrou ...

  8. android ripple水波纹详解

    Ripple是Material Design(材料设计)中的效果: 虽然在5.0的机型上,会自带Ripple点击效果,但是有时候需要自己更改点击效果: 使用Ripple的关键就是在android:ba ...

  9. android l 效果,[原]Android L中水波纹点击效果的实现

    博主参加了2014 CSDN博客之星评选,帮我投一票吧. 前言 前段时间android L(android 5.0)出来了,界面上做了一些改动,主要是添加了若干动画和一些新的控件,相信大家对view的 ...

最新文章

  1. 深度剖析RabbitMQ可靠性消息投递以及实践方案
  2. plsql动态的sql
  3. mysql DDL语句
  4. 互联网1分钟 |1220
  5. [视频演示].NET Core开发的iNeuOS物联网平台,实现从设备PLC、云平台、移动APP数据链路闭环...
  6. VIPKID上云 解决多云Web统一安全防护问题
  7. HP ILO2和JRE6(java runtime environment)
  8. IOS基础学习日志(七)利用dispatch_once创建单例及使用
  9. 从零开始刷Leetcode——数组(896.905.914.922)
  10. 最常用的五种PDF阅读器,你都用过了吗!
  11. Java游戏编程不完全详解-2(1万2千字吐血推荐)
  12. PowerDesign介绍与使用
  13. Prometheus(普罗米修斯)监控系统
  14. FontAwesome图标选择器
  15. 信息安全体系建设☞流量可视化(2)sflow
  16. 算法学习之狄克斯特拉算法
  17. 腾讯零反射全动态Android插件框架Shadow解析
  18. 《游戏学习》| 3d网页小游戏 | 公路赛车 源码
  19. 过滤器,监听器,拦截器的区别
  20. 酒店智能门锁常见故障及解决办法

热门文章

  1. 表达式* ptr ++和++ * ptr是否相同?
  2. JS之BOM和DOM(来源、方法、内容、应用)
  3. android开发之后端云bmob的使用
  4. Openfire开发配置,Openfire源码配置,OpenFire二次开发配置
  5. ibator使用心得
  6. 16薪,六险一金,深尚科技招聘视觉/图像算法工程师 ,包含社招和校招
  7. 无需一行代码,完成模型训练和部署,这个AI工具开始公测
  8. CVPR 2019|手写签名认证的逆鉴别网络
  9. 何恺明随机连接神经网络复现
  10. 谷歌发布AdaNet,快速灵活的AutoML工具,帮助开发者构筑强大集成学习模型