Android自定义View——实现水波纹效果类似剩余流量球

三个点   pre   ber   block   span   初始化   move   理解最近突然手痒就想搞个贝塞尔曲线做个水波纹效果玩玩,终于功夫不负有心人最后实现了想要的效果,一起来看下吧:

效果图镇楼

一:先一步一步来分解一下实现的过程

需要绘制一个正弦曲线(sin)或者余弦曲线(cos)

通过水平平移曲线来的到像水波波动的效果

水平移动的同时还需要有水位上涨,也就是向上平移

裁剪画布为圆形,在圆形区域绘制曲线

通过上面4步就可以实现了

二:现在就来实现第一步,绘制一个sin曲线;这里画了一张图来帮助理解,在PhotoShop中我们绘制一个贝塞尔曲线可以清楚的看到它的控制点如图:

绘制贝塞尔曲线我们必须要知道三个点:起点、控制点、终点;有了这三个点我们就可以绘制一段简单二阶贝塞尔曲线。从图中我们可以看出 起点 控制点p1 x1 这三个点绘制了一段曲线,也就是通过path.quadTo()函数添加一个曲线路径。

???假设我们需要绘制一个周期的sin曲线,那么我们就只需要知道起点、一个周期的宽度、振幅;就可以绘制一个sin曲线了。

三:下面就来看下代码的实际操作了,这里就直接省略掉一些画笔初始化的操作了可以点击这里查看源码

protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){

super.onMeasure(widthMeasureSpec,heightMeasureSpec);

//获取view的宽度

width=getViewSize(800,widthMeasureSpec);

//获取view的高度

height=getViewSize(400,heightMeasureSpec);

//获取起点坐标

startPoint=newPoint(0,height/2);

}

1

2

3

4

5

6

7

8

9

首先肯定是要获取到画布的大小才能确定好起点的坐标,有了起点坐标就可以开始绘制我们的曲线了

在ondraw()函数中进行曲线的绘制

/*sin曲线 1/4个周期的宽度*/

privateintcycle=200;

/*sin曲线振幅的高度*/

privateintwaveHeight=200;

@Override

protectedvoidonDraw(Canvascanvas){

super.onDraw(canvas);

path.moveTo(startPoint.x,startPoint.y);

intj=1;

//循环绘制正弦曲线 循环一次半个周期

for(inti=1;i<=8;i++){

if(i%2==0){

//波峰

path.quadTo(startPoint.x+(cycle*j),startPoint.y+waveHeight,

startPoint.x+(cycle*2)*i,startPoint.y);

}else{

//波谷

path.quadTo(startPoint.x+(cycle*j),startPoint.y-waveHeight,

startPoint.x+(cycle*2)*i,startPoint.y);

}

j+=2;

}

//绘制封闭的曲线

path.lineTo(width,height);//右下角

path.lineTo(startPoint.x,height);//左下角

path.lineTo(startPoint.x,startPoint.y);//起点

path.close();

canvas.drawPath(path,paint);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

经过上面一系例操作一个水波纹效果就出来啦

四:接下来就是水平移动这个曲线了为了移动起来更加好看,我们需要在屏幕外面开始绘制一个周期,如下:

//初始化的时候将起点移至屏幕外一个周期

startPoint=newPoint(-cycle*4,height/2);

//继续在ondraw()函数最后追加平移代码

//判断是不是平移完了一个周期

if(startPoint.x+40>=0){

//满了一个周期则恢复默认起点继续平移

startPoint.x=-cycle*4;

}

//每次波形的平移量 40

startPoint.x+=40;

postInvalidateDelayed(150);

path.reset();

1

2

3

4

5

6

7

8

9

10

11

12

13

14

只需要这样就可以产生水波效果了,一起来看效果图吧。

五:接下来就是要将画布变成圆形了(其实还是个矩形,只是绘画区域在你所裁剪的区域),然后在里面实现水波纹就哦的K了;完整的绘制代码如下:

@OverrideprotectedvoidonDraw(Canvascanvas){

super.onDraw(canvas);

//裁剪画布为圆形

PathcirclePath=newPath();

circlePath.addCircle(width/2,height/2,width/2,Path.Direction.CW);

canvas.clipPath(circlePath);

canvas.drawPaint(circlePaint);

canvas.drawCircle(width/2,height/2,width/2,circlePaint);

//以下操作都是在这个圆形画布中操作

//根据进度改变起点坐标的y值

startPoint.y=(int)(height-(progress/100.0*height));

//起点

path.moveTo(startPoint.x,startPoint.y);

intj=1;

//循环绘制正弦曲线 循环一次半个周期

for(inti=1;i<=8;i++){

if(i%2==0){

path.quadTo(startPoint.x+(cycle*j),startPoint.y+waveHeight,startPoint.x+(cycle*2)*i,startPoint.y);

}else{

path.quadTo(startPoint.x+(cycle*j),startPoint.y-waveHeight,startPoint.x+(cycle*2)*i,startPoint.y);

}

j+=2;

}

//绘制封闭的曲线

path.lineTo(width,height);//右下角

path.lineTo(startPoint.x,height);//左下角

path.lineTo(startPoint.x,startPoint.y);//起点

path.close();

canvas.drawPath(path,paint);

drawText(canvas,textPaint,progress+"%");

//判断是不是平移完了一个周期

if(startPoint.x+40>=0){

//满了一个周期则恢复默认起点继续平移

startPoint.x=-cycle*4;

}

//每次波形的平移量 40

startPoint.x+=40;

if(autoIncrement){

if(progress>=100){

progress=0;

}else{

progress++;

}

}

postInvalidateDelayed(150);

path.reset();

}

Android自定义View——实现水波纹效果类似剩余流量球

来源: http://www.bubuko.com/infodetail-2294788.html

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

  1. android自定义水波纹,Android自定义View——实现水波纹效果类似剩余流量球(示例代码)...

    最近突然手痒就想搞个贝塞尔曲线做个水波纹效果玩玩,终于功夫不负有心人最后实现了想要的效果,一起来看下吧: 效果图镇楼 一:先一步一步来分解一下实现的过程 需要绘制一个正弦曲线(sin)或者余弦曲线(c ...

  2. Android自定义View——实现水波纹效果类似剩余流量球

    最近突然手痒就想搞个贝塞尔曲线做个水波纹效果玩玩,终于功夫不负有心人最后实现了想要的效果,一起来看下吧: 效果图镇楼 一:先一步一步来分解一下实现的过程 需要绘制一个正弦曲线(sin)或者余弦曲线(c ...

  3. 自定义view实现水波纹效果

    水波纹效果: 1.标准正余弦水波纹: 2.非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余弦函数模拟水波纹效果,另外一个会运用到图像的混合模式(PorterDuffX ...

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

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

  5. android自定义水波纹,android 自定义view-水波纹进度球

    android 进阶之路-自定义view-水波纹进度球 如果你是老司机,一看标题就会就return吧,嘻嘻. 在我们的日常开发中自定义控件还是用的挺多的,设计师或者产品为了更好的漂亮,美观,交互都会做 ...

  6. android实现喇叭播放效果图,自定义View 实现音频播放效果

    这已经是第二次实现这种效果了.记录下来. 首先看下效果图.这里就不搞gif 了 image.png 1.首先确定需要音频条得数量 2.根据大小计算出 间距和音频条得宽度 3.绘制初始样式 4.利用ha ...

  7. Android中实现Bitmap在自定义View中的放大与拖动

    一基本实现思路: 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对MotionEvent事件的监听与处理 ...

  8. android 图片圆角 遮罩_Android 自定义View练手Demo(一)实现圆角遮罩效果

    Android 自定义View系列文章 Android自定义View实现圆角遮罩效果 一图胜千言,有一个遮罩就会凸显出重点区域 1-1.jpg 本文通过两种方式来实现这种效果,来达到自定义View练手 ...

  9. Android软件开发之盘点自定义View界面大合集(二)

    Android软件开发之盘点自定义View界面大合集(二) - 雨松MOMO的程序世界 - 51CTO技术博客 雨松MOMO带大家盘点Android 中的自定义View界面的绘制 今天我用自己写的一个 ...

最新文章

  1. 【洛谷P1966】火柴排队
  2. python如何爬取sci论文中所需的数据_sci论文中的科研数据处理方法
  3. 比起月薪过万的程序员大多数人居然选择了月薪3K的公务员?
  4. java 反射 动态_java实现反射,动态配置
  5. leetcode 1037. 有效的回旋镖(Valid Boomerang)
  6. VNC Connect Enterprise for mac(远程桌面软件)
  7. python 制作聊天程序-python实现点对点聊天程序
  8. C#模拟union接收
  9. 2020最新项目经理面试题(持续更新)
  10. python中find函数的使用方法_详解Python中find()方法的使用
  11. STM32中关于高电平有效,低电平有效的一点理解
  12. Cassandra启动过程详解【原创】
  13. Latex命令、符号、公式、数学符号编辑
  14. [NXP.iMX6UL] NFS服务器
  15. Android 仿小米的全面屏手势-侧滑返回
  16. 使用Photoshop给Premiere批量添加对白字幕听语音 |浏览:25974|更新:2013-12-23 23:18|标签:photoshop premiere 使用Photoshop给Pre
  17. 使用TIMESTAMPDIFF计算两个时间戳之间的时间间隔需要注意的细节
  18. WorkBook的SaveAs方法
  19. 工具类-汉字转为汉语拼音首字母
  20. UI导航栏设计规范及注意事项有哪些?

热门文章

  1. JAVA程序设计----异常
  2. leetcode 501. 二叉搜索树中的众数(Java版)
  3. 【Java数据库】CLOB BLOB 在数据库中存入/取出大量文本数据、二进制文件(图片)
  4. 区块链系列教程之:比特币的世界
  5. read-only file system怎么改权限_“我就退出家长群!怎么了?”压垮成年人仅需一个“家长群”上热搜?...
  6. lostash Timeout executing grok 问题排查
  7. 洛谷——P1223 排队接水
  8. 入门JavaScript?看懂这篇文章就够了!——Web前端系列学习笔记
  9. 【已解决】图灵机模型(模拟二进制非负整数加1)
  10. 为什么TCP连接至少3次握手