Android点击Button水波纹效果

先上图,看看接下来我要向大家介绍的是个什么东西,如下图:
这里写图片描述
接下来要介绍的就是如何实现上述图中的波纹效果,这种效果如果大家没有体验过的话,可以看看百度手机卫士或者360手机卫士,里面的按钮点击效果都是这样的,另外Android 5.0以上的版本也出现了这种效果。不多说,下面聊聊具体的怎么实现。

首先大家看到的是三个button,水波纹的出现给我们的错觉是直接将波纹绘制在button上面的,但是这样能做到吗?首先button自己有background和src,如果把半透明的水波纹当作background或者src绘制到button上面,肯定是会损失button原有的样式的。可能有朋友猜想那就把水波纹绘制在屏幕上呗,恭喜这位朋友答对了,至少我是这么干的,具体思路就是,我们自己实现一个layout,在layout中捕捉事件,并对事件进行相应的处理,在down事件中寻找当前用户点击的是哪个view,找出view所在的矩形区域,将一个透明的圆环绘制到这个矩形区域,在up事件中,延时分发view的onclick事件。
1、自己实现一个layout:
2、重写layout的dispatchTouchEvent方法,在down事件中找出被点击的view。

    public View findTargetView(float x, float y, View anchorView) {ArrayList<View> touchablesView =  anchorView.getTouchables();View targetView = null;for (View child : touchablesView) {RectF rectF = getViewRectF(child);if (rectF.contains(x, y) && child.isClickable()) {// 这说明被点击的view找到了targetView = child;break;}}return targetView;}

接着找出view所在的矩形区域,因为要将波纹绘制到该区域:

    public RectF getViewRectF(View view) {int[] location = new int[2];view.getLocationOnScreen(location);int childLeft = location[0];int childTop = location[1];int childRight = childLeft + view.getMeasuredWidth();int childBottom = childTop + view.getMeasuredHeight();return new RectF(childLeft, childTop, childRight, childBottom);}

矩形区域找到之后,这个区域就是我们要绘制的博波纹所在地,上面也说过了,波纹其实就是圆环,绘制圆的画是需要知道圆心坐标和圆的半径,圆心坐标肯定就是down时候的x和y了,但是半径怎么计算合适?大家看到上面的图知道如果view的宽度大于高度,点击view的左下角或者右下角,那么半径基本上就是等于view的宽度,点击view的上部或者下部分,半径就是在0和view的高度之间,具体的计算方式看下图:
这里写图片描述
那么根据上图,半径的计算方式就应该是:

    float left = circleCenterX - targetTouchRectF.left;float right = targetTouchRectF.right - circleCenterX;float top = circleCenterY - targetTouchRectF.top;float bottom = targetTouchRectF.bottom - circleCenterY;// 计算出最大的值则为半径rawRadius = Math.max(bottom, Math.max(Math.max(left, right), top));

半径算出来了,虽说圆心就是down时的x和y,但是有个地方还是需要注意的,在绘制圆环的时候提供的圆心坐标的x和y是在本文中是相对于layout的,所以在计算y的时候是需要进行一定处理的:

    /*** 获取圆环的中心坐标*/public float[] getCircleCenterPostion(float x,float y){int[] location = new int[2];float[] mDownPositon = new float[2];getLocationOnScreen(location );mDownPositon[0] = x;mDownPositon[1] = y -location[1];return mDownPositon;}

圆心坐标和半径都计算好了,记下来就可以绘制圆形波纹了,那么在哪里绘制这个波纹比较合适呢?有朋友立马就说肯定是在onDraw方法里面绘制了,那么恭喜你在我看来你是答错了,我们的layout中是很有很多childview的,而layout是个viewGroup,viewGroup在绘制的时候,是先绘制自身的背景,再绘制自身,再绘制childview,如果在onDraw中绘制波纹,也就意味者后面绘制出来的childView会将我们的波纹遮盖,所以我们就应该等到childview绘制完毕后再来绘制波纹,这样可以保证childview在最顶层。
重写dispatchDraw方法:

    @Overrideprotected void dispatchDraw(Canvas canvas) {super.dispatchDraw(canvas);/*** 绘制完子元素后开始绘制波纹*/if (mTargetTouchView != null) {RectF clipRectF = clipRectF(mTargetTouchView);canvas.save();// 为了不让绘制的圆环超出所要绘制的范围canvas.clipRect(clipRectF);if(drawedRadius < rawRadius){drawedRadius += rawRadius / drawingRadiusDegrees;canvas.drawCircle(mDownPositon[0], mDownPositon[1], drawedRadius, mHalfTransPaint);postInvalidateDelayed(INVALID_DURATION);}else{canvas.drawCircle(mDownPositon[0], mDownPositon[1], rawRadius, mTransPaint);post(delayedRunnable);}canvas.restore();}}

在分发绘制事件中大家可以看到,波纹是一段一段的绘制,形如下图:
这里写图片描述
而这一段段的波纹正是通过绘制一个个的圆环实现的,所以在没绘制完毕一个圆环的时候,都需要延时重新绘制下一个圆环。
通过上面波纹效果基本上完成了,但是按钮是有点击事件的,像360手机卫士或者百度手机卫士等都是等波纹效果播放完毕后才会响应点击事件,所以我们这里也要对这个点击事件进行延时响应。
在up事件中,记录此次事件的event,并且返回true,表示消费此次的事件,然后再圆环绘制完毕后,再利用找到的view去分发这个event:

    if (ev.getAction() == MotionEvent.ACTION_UP) {// 需要让波纹绘制完毕后再执行在up中执行的方法
//          if(drawedRadius==0){
//              return false;
//          }
//          long totalTime = (long) (INVALID_DURATION * (drawingRadiusDegrees+5));
//          // 离波纹结束的时间
//          long time = (long) (totalTime - drawedRadius*totalTime / rawRadius);delayedRunnable.event = ev;return true;}class postUpEventDelayed implements Runnable{private MotionEvent event;@Overridepublic void run() {if(mTargetTouchView!=null && mTargetTouchView.isClickable()&& event!=null){mTargetTouchView.dispatchTouchEvent(event);// 分发}}}

在dispatchDraw方法中,判断如果绘制完毕就post(delayedRunnable);执行childView的事件延时分发。

本文就写到这里了,本文案例的实现同时也参考了http://m.blog.csdn.net/blog/singwhatiwanna/42614953。在此对博主表示感谢。

源码下载连接:Android button点击水波纹效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/45513.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity 实现水的波纹效果

之前的实现过这个效果&#xff0c;可惜没有记笔记&#xff0c;所以现在有点遗忘&#xff0c;连多个波纹一起在水面上实现的效果都忘记了&#xff0c;所以&#xff0c;查看了下之前实现的代码&#xff0c;现在再记一下笔记。 基础的波纹效果 要实现波纹&#xff0c;首先要知道…

Android水波纹效果

日常的Android开发中可能大家都见过类似这种水波纹展开的效果&#xff0c;比如加载一张图片的时候使用水波纹加载&#xff0c;其实这种实现非常简单。因为Google已经为我们提供了一个非常方便地工具类 ViewAnimationUtils 它的实现非常简单&#xff0c;就这个类&#xff0c;其…

自定义view实现水波纹效果

我正在参加 CSDN 2015博客之星评选 感恩分享活动&#xff0c;如果觉得文章还不错&#xff0c;请投个票鼓励下吧&#xff1a;http://vote.blog.csdn.net/blogstar2015/candidate?usernametianjian4592 在实际的开发中&#xff0c;很多时候还会遇到相对比较复杂的需求&#xf…

Android L中水波纹点击效果的实现

博主参加了2014 CSDN博客之星评选&#xff0c;帮我投一票吧。 点击给我投票 前言 前段时间android L&#xff08;android 5.0&#xff09;出来了&#xff0c;界面上做了一些改动&#xff0c;主要是添加了若干动画和一些新的控件&#xff0c;相信大家对view的点击效果-水波纹很…

科技云报道:垂直大模型竞争,能突破数据“卡点”吗?

科技云报道原创。 AI大模型火遍全球&#xff0c;中国产业也激发了对人工智能应用的新热情。 随着各大厂商参与竞逐&#xff0c;市场正在分化为通用与垂直两大路径&#xff0c;两者在参数级别、应用场景、商业模式等方面差异已逐步显现。 企业涌入垂直大模型赛道 通用AI大模型…

【人工智能】论未来人工智能的大模型生态:重塑技术前景与应用

目录 未来人工智能大模型生态:重塑技术前景与应用 引言 OpenAI 的 AGI 愿景

创造之境:Stable Diffusion + chatGPT下的自动绘图探索

什么是Stable Diffusion Stable Diffusion 是在2022年发布的深度学习文本到图像生成模型。它主要用于根据文字的描述生成详细图像&#xff0c;尽管它也可以应用于其他任务&#xff0c;如内插绘制、外插绘制&#xff0c;以及在提示词&#xff08;英语&#xff09;指导下生成图生…

工具 | ChatPDF:与PDF对话!

工具 | ChatPDF&#xff1a;与PDF对话&#xff01; 本文首发微信公众号&#xff1a;全副武装的大师兄 ChatPDF是什么&#xff1f; 它是一个在不到一周时间里&#xff0c;就让10万份PDF学会了聊天的应用&#xff01;无需注册&#xff0c;登录&#xff0c;通过上传PDF文件到Ch…

微信公众号 接口配置

1、登录微信公众平台-->设置与开发-->基本配置页面&#xff0c;打开服务器配置 2、在网站后台添加两个接口get请求验证和post请求消息转发&#xff0c;url为上图填写的url&#xff0c; RestController RequestMapping("/officialAccount/") public class Offic…

亚马逊评论和销量的关系都有哪些呢?

评论和销量的关系非常密切。当然不是评论越多越好&#xff0c;更合理的评论对产品的关键词排名帮助更大。就连亚马逊也会推荐一些资源&#xff0c;所以推荐和曝光越多&#xff0c;销量也会增加越多。这也是为什么卖家都在努力增加Review数量&#xff0c;甚至花钱找人做评测还免…

亚马逊评论的类型有哪些?都该怎么操作呢?

亚马逊评论对于亚马逊卖家店铺来说很重要的&#xff0c;评论又多又好的产品自然更受欢迎&#xff0c;但是评论肯定不只一种&#xff0c;那么亚马逊评论的类型有哪些&#xff1f;都该怎么操作呢&#xff1f; 亚马逊评论分为以下几种&#xff1a; 1、直评 直评是买家可以不用购…

视频会议解决方案-最新全套文件

视频会议解决方案-最新全套文件 一、建设背景二、建设思路业务挑战 三、建设方案四、获取 - 视频会议全套最新解决方案合集 一、建设背景 随着中国经济的迅速发展&#xff0c;很多企业的发展也进入快车道&#xff0c;分支机构越来越多&#xff0c;形成了遍布全国范围甚至全球范…

微软:明年 7 月之前,所有会议线上举行

By 超神经 内容提要&#xff1a;这场疫情对科技行业带来了重大影响。自 2 月以来&#xff0c;被迫取消或转至线上的科技峰会已经数不胜数。现在&#xff0c;微软已经决定&#xff0c;将明年下半年之前的所有活动转至线上&#xff0c;科技会议或许就此迎来变革&#xff1f; 关键…

智能会议纪要生成,从音视频到一键生成会议特征数据

★★★ 本文源自AI Studio社区精品项目&#xff0c;【点击此处】查看更多精品内容 >>> 零.项目背景 目标&#xff1a;针对会议场景的长视频或者长语音&#xff0c;自动生成会议记录并通过摘要生成技术形成会议摘要。 一.技术流程 1.通过moviepy 提取视频中的音频&am…

本地电脑腾讯会议PPT演讲者模式

在腾讯会议中进行PPT汇报的时候&#xff0c;有些情况我们是想要看到备注的&#xff0c;即如何实现对自己是演讲者模式&#xff0c;而对其他人展示的是报告全屏内容呢&#xff1f; 不同操作系统的电脑实现方式还不同&#xff0c;下面分别介绍&#xff1a; 对于mac系统&#xf…

会中切换网络总掉线?腾讯会议用这种方案让你好好开会

&#x1f449;腾小云导读 也许你有这样的体验&#xff1a;当你加入腾讯会议开会&#xff0c;老板正在发布重要任务时&#xff0c;你恰好要进电梯时 wifi 切换成了 cellular&#xff0c;画面开始「转菊花」&#xff0c;网络断开重连却需要好久&#xff0c;最终老板的指示你一个字…

腾讯会议的各种使用办法

如何关闭某一成员突然打开的麦克风 1.点击管理成员 2.点击关闭麦克风或者关闭视频即可 如何更换背景 1.点击设置 2.点击虚拟背景和美颜 3.选择已有背景或者点击支持图片/视频从本地进行上传 调整声音 1.点击设置 2.点击音频 3.点击音量调节

Zoom会议使用指南

一、使用手册 1、加入会议 1.1 下载ZOOM 下载ZOOM客户端&#xff1a;https://ruanshi1.8686c.com/prod/4.4.55389.0716/ZoomInstaller.exe 1.2 点击加入会议 1.3 点击会议URL或输入会议ID https://cnegroup.zoom.us/j/768131602 1.4 开始会议 2、召开会议 2.1登录Zoom 2.…

使用 Microsoft Teams 开会到底有多少途径——建会

疫情原因公司开始远程办公&#xff0c;过程不赘述&#xff0c;最终选择了 Microsoft Teams 作为开会的工具。 通过这几个月的摸索&#xff0c;终于算是上手了&#xff0c;开始时被 Teams 开会整懵圈了&#xff0c;每天收到各种工单&#xff0c;问怎么开会。后来发现 Teams 开会…

使用 Microsoft Teams 开会到底有多少途径——参会

上一篇关于Teams建会的文章发完之后&#xff0c;总想着把参会的赶紧写了&#xff0c;结果发现两个月就这么过去了&#xff0c;趁着最近不忙&#xff0c;赶紧更新 接前文 使用 Microsoft Teams 开会到底有多少途径——建会添加链接描述 和建会一样&#xff0c;参会也是条条大路…