看到android 5.0有一个按钮点击效果非常棒,先来看效果图:

但是这种效果只能在5.0的系统上有效果,如何在低版本上实现呢?

这种效果网上也有人实现了,

blog 地址http://blog.csdn.net/singwhatiwanna/article/details/42614953

ok,直接进入主题,

要实现这种动画效果也不难,原理可以用一句话概括:就是,在我们按下view的时候,从按下的位置开始绘制圆,圆的半径一直增大,直至把View全部覆盖掉。

通过实现原理我们可以分析出,要实现这种效果,需要重写onDraw方法,onTouchEvent方法,如果有必要还需要通过onMeasure方法来获取View的size

1、onDraw方法,就是不断的绘制圆,这里需要循环调用,

2、onTouchEvent方法:通过MotionEvent.ACTION_DOWN和MotionEvent.ACTION_UP做相应的操作并触发onDraw方法

3、onMeasure计算View的size,通过size加上MotionEvent.ACTION_DOWN起始点计算出圆的最大半径

代码实现:

保存view的大小,用于计算绘制 圆的最大半径

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

mRect.set(0, 0, getMeasuredWidth(), getMeasuredHeight());

}

手指按下view的时候,计算按下点的位置,并触发onDraw方法

public boolean onTouchEvent(MotionEvent event) {

final int action = MotionEventCompat.getActionMasked(event);

switch (action) {

case MotionEvent.ACTION_DOWN: {

mDrawFinish = false;

int index = MotionEventCompat.getActionIndex(event);

int eventId = MotionEventCompat.getPointerId(event, index);

if (eventId != -1) {

mInitX = (int) MotionEventCompat.getX(event, index);

mInitY = (int) MotionEventCompat.getY(event, index);

updateDrawData();

ViewCompat.postInvalidateOnAnimation(this);

}

return true;

}

更新数据,重新计算圆的半径和步长

private void updateDrawData() {

int radiusLeftTop = (int) Math.sqrt((mRect.left - mInitX) * (mRect.left - mInitX) +

(mRect.top - mInitY) * (mRect.top - mInitY));

int radiusRightTop = (int) Math.sqrt((mRect.right - mInitX) * (mRect.right - mInitX) +

(mRect.top - mInitY) * (mRect.top - mInitY));

int radiusLeftBottom = (int) Math.sqrt((mRect.left - mInitX) * (mRect.left - mInitX) +

(mRect.bottom - mInitY) * (mRect.bottom - mInitY));

int radiusRightBottom = (int) Math.sqrt((mRect.right - mInitX) * (mRect.right - mInitX) +

(mRect.bottom - mInitY) * (mRect.bottom - mInitY));

mRadius = getMax(radiusLeftTop, radiusRightTop, radiusLeftBottom, radiusRightBottom);

mStep = mRadius/mCycle;

}

手指抬起的时候需要做的操做,把步长加大2.5倍,加快圆的绘制

@Override

public boolean onTouchEvent(MotionEvent event) {

final int action = MotionEventCompat.getActionMasked(event);

switch (action) {

//..

case MotionEvent.ACTION_CANCEL:

case MotionEvent.ACTION_UP:

mStep = (int) (2.5f * mStep);

mDrawBack = true ;

break;

}

return super.onTouchEvent(event);

}

最后就是绘制圆了,这里需要做判断,如果当前绘制的圆半径没有达到我们计算的最大半径,需要继续绘制

@Override

protected void onDraw(Canvas canvas) {

if (mDrawFinish) {

super.onDraw(canvas);

return;

}

canvas.drawColor(0x08000000);

super.onDraw(canvas);

if (mStep == 0) {

return;

}

mDrawRadius = mDrawRadius + mStep;

if (mDrawRadius > mRadius) {

mDrawRadius = 0;

canvas.drawCircle(mInitX, mInitY, mRadius, mRevealPaint);

mDrawFinish = true;

ViewCompat.postInvalidateOnAnimation(this);

return;

}

canvas.drawCircle(mInitX, mInitY, mDrawRadius, mRevealPaint);

ViewCompat.postInvalidateOnAnimation(this);

}

整个效果的实现,相对比较简单,只是很无聊的一直绘圆。

最后要说明一点,如果你想对TextView做这种效果,则继承TextView即可,LinearLayout等其他组件同理;

demo下载

android ripple 大小,Android Ripple 旋钮水波纹效果(一)相关推荐

  1. html5 水波式按钮_css3+jQuery实现按钮水波纹效果

    水波纹按钮 /*自定义按钮样式*/ .btns{ height: 30px; line-height: 30px; text-align: center; width: 200px; color: # ...

  2. css波纹波动效果,CSS 冲击波(水波纹)效果

    实现冲击波--数学知识很重要 *{ margin:0; padding:0; box-sizing:border-box; } html,body{ font-family:"微软雅黑&qu ...

  3. 【安卓R 源码】Ripple 水波纹效果源码

    安卓使用ripple实现点击时的涟漪效果 - 简书 https://www.jb51.net/article/145309.htm Android:RippleDrawable 水波纹/涟漪效果 - ...

  4. Android开发中的水波纹效果实现

    编写不易,如有转载,请声明出处:http://blog.csdn.net/zxc514257857/article/details/73200900 前言   android中的水波纹效果是5.0以后 ...

  5. android水波纹点击动画,android 控件点击水波纹效果的几种方案

    目前我所知道的至少有三种可以实现点击水波纹的效果 第一种:安卓自带的方法 在安卓中有自带的一种属性,可以实现水波纹的效果,就是在所需要点击的控件属性加上如下代码: android:background ...

  6. Android点击水波纹扩散效果整理(附带一个自定义的水波纹效果控件)

    很久很久没有写博客了,说来也有点惭愧.正好最近整理自己的项目工程目录,看到一些值得分享的控件,准备在之后的几篇博客中准备把它们陆续搬运上来. 这篇博客准备整理一下Android Material De ...

  7. Android 水波纹效果的探究

    前言 水波纹效果从Android5.0就已经出来了,基本的使用相信大家都知道了,这里多谈一些相对深层次的使用: 1.基本使用 2.水波纹效果与布局绘制之间的问题 3.长按水波纹扩散效果 4.Butto ...

  8. android 立体 流量球,Android自定义View——实现水波纹效果类似剩余流量球

    Android自定义View--实现水波纹效果类似剩余流量球 三个点   pre   ber   block   span   初始化   move   理解最近突然手痒就想搞个贝塞尔曲线做个水波纹效 ...

  9. Android 之自定义view实现水波纹效果

    在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了个让人兴奋的效果,兴致高昂的来找你,看了之后目的很明确,当然就是希望你能给她: 在这样的关键时候,身子板就一定得硬了, ...

最新文章

  1. 50的阶乘用c语言编写,求10000的阶乘(c语言代码实现)
  2. Linux yum 命令
  3. Redis 是单线程凭什么能支撑高并发
  4. “局部图像特征描述概述”--樊彬老师
  5. PHP的十个高级技巧
  6. 利用python自定义完整版迭代器
  7. python解决xml文件中存在中文文字的问题
  8. FFT,NTT 专题
  9. 《寄生虫》横扫奥斯卡,Python告诉你这部电影到底好在哪里?
  10. cad插件_CAD插件坐标标注安装教程
  11. 通过Centos7搭建PXE安装Windows操作系统和Centos操作系统及WindowsPE维护系统
  12. Excel 2010高级应用-饼图(四)
  13. excel求回归直线方程的公式_如何用excel快速求线性回归方程?
  14. 域名申请、解析和备案
  15. java 在pdf中插入图片_新手教程!如何在PDF文件中插入图像
  16. grafan 6.3.x pannel研究
  17. 【K210】K210学习笔记七——使用K210拍摄照片并在MaixHub上进行训练
  18. htm盒子模型与定位
  19. 计算机网络中的层次结构
  20. 30+项目经理,少奋斗5年的职业规划路线

热门文章

  1. 三 虚拟机安装Deepin
  2. 【强化学习】策略梯度Policy-Gradient
  3. 【CUDA7.5】MATLAB中配置Win7+Matlab R2015b+CUDA7.5+vs2013配置方法
  4. 【双边滤波】基于小波变换的多尺度自适应THZ增强双边滤波器的MATLAB仿真
  5. redis在linux下安装并測试(在spring下调用)
  6. AS3 鼠标指针样式
  7. 使用8位字节的编码格式将字节流安全的转换成String
  8. Object Builder Application Block (2)
  9. python批量给文件命名为001,002,...【亲测有效】
  10. leetcode 752. 打开转盘锁 c代码