转载自:http://blog.csdn.net/chdjj/article/details/38142953

先来看效果:

实现方式----->自定义控件
核心代码:
  1. package com.example.wavedemo1;
  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.Color;
  5. import android.graphics.Paint;
  6. import android.graphics.Path;
  7. import android.os.Handler;
  8. import android.util.AttributeSet;
  9. import android.view.View;
  10. /**
  11. * @author Rowandjj
  12. *
  13. *仿猎豹清理大师波浪效果
  14. */
  15. public class WaterWaveView extends View
  16. {
  17. private Handler mHandler;
  18. private long c = 0L;
  19. private boolean mStarted = false;
  20. private final float f = 0.033F;
  21. private int mAlpha = 70;//透明度
  22. private int mColor = Color.BLUE;
  23. private float mAmplitude = 6.0F; // 振幅
  24. private final Paint mPaint = new Paint();
  25. private float mWateLevel = 0.5F;//水高(0~1)
  26. private Path mPath;
  27. public WaterWaveView(Context paramContext)
  28. {
  29. super(paramContext);
  30. init(paramContext);
  31. }
  32. public WaterWaveView(Context paramContext, AttributeSet paramAttributeSet)
  33. {
  34. super(paramContext, paramAttributeSet);
  35. init(paramContext);
  36. }
  37. /**
  38. * 开始波动
  39. */
  40. public void startWave()
  41. {
  42. if (!mStarted)
  43. {
  44. this.c = 0L;
  45. mStarted = true;
  46. this.mHandler.sendEmptyMessage(0);
  47. }
  48. }
  49. private void init(Context context)
  50. {
  51. mPaint.setStrokeWidth(1.0F);
  52. mPaint.setColor(mColor);
  53. mPaint.setAlpha(mAlpha);
  54. mPath = new Path();
  55. mHandler = new Handler()
  56. {
  57. @Override
  58. public void handleMessage(android.os.Message msg)
  59. {
  60. if (msg.what == 0)
  61. {
  62. invalidate();
  63. if (mStarted)
  64. {
  65. //不断发消息给自己,使自己不断被重绘
  66. mHandler.sendEmptyMessageDelayed(0, 60L);
  67. }
  68. }
  69. }
  70. };
  71. }
  72. @Override
  73. protected void onDraw(Canvas canvas)
  74. {
  75. canvas.save();
  76. mPaint.setAlpha(mAlpha);
  77. mPaint.setColor(mColor);
  78. // 得到控件的宽高
  79. int width = getWidth();
  80. int height = getHeight();
  81. // 如果未开始(未调用startWave方法),绘制一个矩形
  82. if ((!mStarted) || (width == 0) || (height == 0))
  83. {
  84. canvas.drawRect(0.0F, height / 2, width, height, mPaint);
  85. return;
  86. }
  87. if (this.c >= 8388607L)
  88. {
  89. this.c = 0L;
  90. }
  91. //每次onDraw时c都会自增
  92. this.c = (1L + this.c);
  93. float f1 = height * (1.0F - mWateLevel);
  94. int top = (int) (f1 + mAmplitude);
  95. mPath.reset();
  96. // 绘制矩形,即水面静止时的高度
  97. canvas.drawRect(0.0F, top, width, height, mPaint);
  98. int startX = 0;
  99. //波浪效果
  100. while (startX < width)
  101. {
  102. int startY = (int) (f1 - mAmplitude* Math.sin(Math.PI* (2.0F * (startX + this.c * width * this.f))/ width));
  103. canvas.drawLine(startX, startY, startX, top, mPaint);
  104. startX++;
  105. }
  106. canvas.restore();
  107. }
  108. /**
  109. * 设置振幅
  110. * @param amplitued
  111. */
  112. public void setAmplitude(float amplitued)
  113. {
  114. mAmplitude = amplitued;
  115. }
  116. /**
  117. * 设置透明度
  118. * @param alpha
  119. */
  120. public void setWaterAlpha(float alpha)
  121. {
  122. this.mAlpha = ((int) (255.0F * alpha));
  123. mPaint.setAlpha(this.mAlpha);
  124. }
  125. /**
  126. * 设置颜色
  127. * @param color
  128. */
  129. public void setColor(int color)
  130. {
  131. this.mColor = color;
  132. }
  133. /**
  134. * 设置水面高度
  135. * @param paramFloat
  136. */
  137. public void setWaterLevel(float paramFloat)
  138. {
  139. mWateLevel = paramFloat;
  140. }
  141. @Override
  142. protected void onAttachedToWindow()
  143. {
  144. super.onAttachedToWindow();
  145. // 关闭硬件加速,防止异常unsupported operation exception
  146. this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
  147. }
  148. }
向普通控件一样,在布局文件中配置:
[html]  view plain copy
  1. <com.example.wavedemo1.WaterWaveView
  2. android:id="@+id/wav"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. />

然后在代码中通过调用startWave方法使水面开始波动,同时可以调用set方法控制其属性。

仿猎豹清理大师波浪效果相关推荐

  1. 【安卓笔记】仿猎豹清理大师波浪效果

    先来看效果: 实现方式----->自定义控件 核心代码: [java] view plain copy package com.example.wavedemo1; import android ...

  2. Android 自定义控件-高仿猎豹清理大师自定义内存开口圆环控件

    技术:Android+java 概述 看见猎豹清理大师的内存开口圆环比例进度 挺有意思的,于是就是想自己实现下这样的效果,于是反编译了猎豹清理 大师的app看了下,原来是有两张图,于是脑子里就过了下思 ...

  3. Android 自定义View修炼-高仿猎豹清理大师自定义内存开口圆环比例进度View

    一.概述 看见猎豹清理大师的内存开口圆环比例进度 挺有意思的,于是就是想自己实现下这样的效果,于是反编译了猎豹清理 大师的app看了下,原来是有两张图,于是脑子里就过了下思路,利用上下两张图,旋转上面 ...

  4. Android动画定时lnvaliate,猎豹清理大师波浪动画实现

    感谢段大师的指导! 波浪效果源码: 自定义控件:实现 package com.apidemos2.animation.bezierview; import android.content.Contex ...

  5. 猎豹清理大师波浪动画实现

    感谢段大师的指导! 波浪效果源码: 自定义控件:实现 package com.apidemos2.animation.bezierview;import android.content.Context ...

  6. 【安卓注意事项】模仿猎豹清理大师波效应

    先来看效果: 实现方式----->自己定义控件 核心代码: package com.example.wavedemo1; import android.content.Context; impo ...

  7. 系统清理软件测试,用户体验最好的清理APP 猎豹清理大师软件评测

    从iOS7升级到iSO8,让iPhone用户意识到一个问题--手机空间又不够用了!对于iPhone而言,想获得更多的可用空间,只能靠删之前的照片视频和重装APP清理缓存等方式来挤出更多空间.而对于安卓 ...

  8. PMCAFF微课堂|猎豹清理大师亿万用户量产品背后的紫牛方法论,傅盛不会说的秘密...

    嘉宾简介 分享主题 猎豹清理大师亿万用户量产品背后的紫牛方法论,付盛不会说的秘密 分享简介 分享形式:微信群分享 分享时长:1-2小时 课程大纲 1.分享猎豹清理大师亿万用户量产品背后的故事 2.什么 ...

  9. CSS3高仿百度外卖头像波浪效果

    好Q啼的头像,说好的波浪捏,浪到哪里去了,别急,静静欣赏动态效果:链接:https://pan.baidu.com/s/1gfAM3y7 密码:wxn6 技术: 1.css water wave 实现 ...

最新文章

  1. LeetCode--258--各位相加*
  2. 河北科技创新平台年报系统 - 头脑风暴会
  3. 大剑无锋之如何查看一个java进程的堆内存使用情况(jps,jstack,jmap)【面试推荐】
  4. Xamarin.Forms 5.0 项目实战发布!
  5. Java CharArrayWriter size()方法与示例
  6. C Tricks(四)—— 从数组中随机选择一个元素
  7. MFC隐藏EditControl控件的光标
  8. VC中调用 Excel 的总结
  9. java sqlite sqlite_busy_sqlite3 busy timeout
  10. 什么是URL?URL是什么意思?
  11. 一个好用的数学公式编辑器的下载安装(LaTeX)
  12. Ubuntu 22.04 双网卡网关设置报错:Conflicting default route declarations for IPv4
  13. h5 php 拍照上传图片,H5拍照、选择图片上传组件核心
  14. 腾讯云 linux pptpd 搭建 和遇到的部分问题解决
  15. win32 绘制超酷界面(二)
  16. 《易经》 数中以9最为奇妙
  17. tkinter--画布
  18. 米米商城项目实战(含项目源码)
  19. python print时清除上一行_python3,如何用print清除行覆盖?
  20. 解决华为笔记本安装驱动后浏览器频闪

热门文章

  1. ps beta爱国版下载全过程
  2. php编程狼追兔子,C语言狼追兔子问题
  3. vant 做表格_Vant Cell 单元格
  4. mysql查询比对提速_MySQL查询性能优化
  5. c语言中strcpy函数的功能是,strcpy函数的作用是是什么?
  6. 因乐视网IPO财务造假,多位发审委委员被抓;旷视科技完成 4.6亿美元C轮融资丨价值早报
  7. Manjaro Linux 连接蓝牙鼠标后重启电脑得重新连接 解决方案
  8. js 判断值是否为数字
  9. PHP支付宝支付事务,php实现支付宝app支付和异步通知的代码实例
  10. 《代码大全2》第12章 基本数据类型