android ripple 大小,Android L限制Ripple水波纹范围大小
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水波纹范围大小相关推荐
- Android: Jetpack Compose如何禁用涟漪(水波纹)效果
系列文章目录 Android: Jetpack Compose如何禁用涟漪(水波纹)效果 Android:使用Jetpack Compose 实现Text控件跑马灯效果 Android:使用Jetpa ...
- Android Material Design 之 Activity 跳转水波纹扩散动画
博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此 博主:威威喵 | 博客主页:https://blog.csdn.net/ ...
- Android view.settran,Android RecyclerView从入门到玩坏
目录 前言 基础使用 分隔线 点击监听 搭配CardView 更丰富的条目 增删条目 快速添加视图 让RecyclerView支持复杂视图 最后前言 RecyclerView在Android界面开发当 ...
- 去除安卓点击的水波纹效果
在引用了appcompat_v7包后,Android Studio主题样式Base application theme会自动引用最新的主题样式Theme.AppCompat.Light:sdk21版本 ...
- css+js实现水波纹效果
效果如下 新建HTML文件,把下面的代码直接贴进来,浏览器打开看效果. 在线运行 <!DOCTYPE html> <html lang="en"> < ...
- Android 水波纹点击效果(Ripple Effect)
本文介绍的是Android5.0中其中一个炫酷的效果,点击水波纹扩散效果(Ripple Effect). 以下介绍的实现方式都是调用Android5.0的新API,并非自定义实现,所以只支持在Andr ...
- Android TabLayout选项卡点击选中Ripple水波纹
Android TabLayout选项卡点击时候选中的Ripple水波纹 如果要实现自定义的TabLayout选项卡被点击选中时候的水波纹效果,要从xml属性定义中的: app:tabBackgrou ...
- android ripple水波纹详解
Ripple是Material Design(材料设计)中的效果: 虽然在5.0的机型上,会自带Ripple点击效果,但是有时候需要自己更改点击效果: 使用Ripple的关键就是在android:ba ...
- android l 效果,[原]Android L中水波纹点击效果的实现
博主参加了2014 CSDN博客之星评选,帮我投一票吧. 前言 前段时间android L(android 5.0)出来了,界面上做了一些改动,主要是添加了若干动画和一些新的控件,相信大家对view的 ...
最新文章
- 深度剖析RabbitMQ可靠性消息投递以及实践方案
- plsql动态的sql
- mysql DDL语句
- 互联网1分钟 |1220
- [视频演示].NET Core开发的iNeuOS物联网平台,实现从设备PLC、云平台、移动APP数据链路闭环...
- VIPKID上云 解决多云Web统一安全防护问题
- HP ILO2和JRE6(java runtime environment)
- IOS基础学习日志(七)利用dispatch_once创建单例及使用
- 从零开始刷Leetcode——数组(896.905.914.922)
- 最常用的五种PDF阅读器,你都用过了吗!
- Java游戏编程不完全详解-2(1万2千字吐血推荐)
- PowerDesign介绍与使用
- Prometheus(普罗米修斯)监控系统
- FontAwesome图标选择器
- 信息安全体系建设☞流量可视化(2)sflow
- 算法学习之狄克斯特拉算法
- 腾讯零反射全动态Android插件框架Shadow解析
- 《游戏学习》| 3d网页小游戏 | 公路赛车 源码
- 过滤器,监听器,拦截器的区别
- 酒店智能门锁常见故障及解决办法
热门文章
- 表达式* ptr ++和++ * ptr是否相同?
- JS之BOM和DOM(来源、方法、内容、应用)
- android开发之后端云bmob的使用
- Openfire开发配置,Openfire源码配置,OpenFire二次开发配置
- ibator使用心得
- 16薪,六险一金,深尚科技招聘视觉/图像算法工程师 ,包含社招和校招
- 无需一行代码,完成模型训练和部署,这个AI工具开始公测
- CVPR 2019|手写签名认证的逆鉴别网络
- 何恺明随机连接神经网络复现
- 谷歌发布AdaNet,快速灵活的AutoML工具,帮助开发者构筑强大集成学习模型