先上效果图

实现原理

总体思路如下:
1、将波浪效果绘制成一个静态的图片
2、将图片往水平和竖直方向,同时并按一定的速率移动

在实现的过程中,主要利用正弦函数 y=Asin(ωx+φ)+h ,设置四个参数(振幅、高度、波长和偏移)来实现波浪的动画效果。

Wate Level(水位):波浪静止时水面距离底部的高度
Amplitude(振幅):波浪垂直振动时偏离水面的最大距离
Wave Length(波长):一个完整的波浪的水平长度
Wave Shift(偏移):波浪相对于初始位置的水平偏移

代码模块

一、绘制波浪图片

mDefaultWaterLevel = getHeight() * DEFAULT_WATER_LEVEL_RATIO;float mDefaultWaveLength = getWidth();float mDefaultAmplitude = getHeight() * DEFAULT_AMPLITUDE_RATIO;double mDefaultAngularFrequency = 2.0f * Math.PI / DEFAULT_WAVE_LENGTH_RATIO / getWidth();Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);Paint wavePaint = new Paint();wavePaint.setStrokeWidth(2);wavePaint.setAntiAlias(true);// y=Asin(ωx+φ)+h 正弦曲线final int endX = getWidth() + 1;final int endY = getHeight() + 1;float[] waveY = new float[endX];wavePaint.setColor(Color.parseColor("#71CFFF")); //后面的波浪for (int beginX = 0; beginX < endX; beginX++) {double wx = beginX * mDefaultAngularFrequency;float beginY = (float) (mDefaultWaterLevel + mDefaultAmplitude * Math.sin(wx));canvas.drawLine(beginX, beginY, beginX, endY, wavePaint);waveY[beginX] = beginY;}wavePaint.setColor(Color.parseColor("#37BFFF")); //前面的波浪final int wave2Shift = (int) (mDefaultWaveLength / 4);for (int beginX = 0; beginX < endX; beginX++) {canvas.drawLine(beginX, waveY[(beginX + wave2Shift) % endX], beginX, endY, wavePaint);}//将波浪曲线的Bitmap变量赋值给画笔mWaveShader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.CLAMP);mViewPaint.setShader(mWaveShader);

二、重写onDraw

@Overrideprotected void onDraw(Canvas canvas) {if (mWaveShader != null) {if (mViewPaint.getShader() == null) {mViewPaint.setShader(mWaveShader);}//根据水位的高度定义 mShaderMatrix 的规模mShaderMatrix.setScale(1, 1, 0, mDefaultWaterLevel);//根据水位的高度和偏移定义 mShaderMatrix 在起始时的位置mShaderMatrix.postTranslate(mWaveShiftRatio * getWidth(), (DEFAULT_WATER_LEVEL_RATIO - mWaterLevelRatio) * getHeight());//将 mShaderMatrix 设置给波浪mWaveShader.setLocalMatrix(mShaderMatrix);canvas.drawRect(0, 0, getWidth(), getHeight(), mViewPaint);} else {mViewPaint.setShader(null);}}

三、定义横纵的动画序列

List<Animator> mAnimators = new ArrayList<Animator>();ObjectAnimator waveShiftAnim = ObjectAnimator.ofFloat(mWaveView, "waveShiftRatio", 0f, 1f); //水平方向循环waveShiftAnim.setRepeatCount(ValueAnimator.INFINITE);waveShiftAnim.setDuration(2000);waveShiftAnim.setInterpolator(new LinearInterpolator());mAnimators.add(waveShiftAnim);ObjectAnimator waterLevelAnim = ObjectAnimator.ofFloat(mWaveView, "waterLevelRatio", mCurrentHeight, height); //竖直方向从0%到x%waterLevelAnim.setDuration(6000);waterLevelAnim.setInterpolator(new DecelerateInterpolator());mAnimators.add(waterLevelAnim);mWaveView.invalidate(); //刷新动画AnimatorSet mAnimatorSet = new AnimatorSet();mAnimatorSet.playTogether(mAnimators);mAnimatorSet.start();

开源分享

源代码工程:http://download.csdn.net/detail/chuck_0430/9738349

转载请注明出处,谢谢!

另声明:本人参考http://www.jianshu.com/p/e711e22e053e的实现效果,完成了自己的需求。特此感谢!

Android水纹波浪动画相关推荐

  1. Android 图片波浪动画,Android水纹波浪动画

    先上效果图 实现原理 总体思路如下: 1.将波浪效果绘制成一个静态的图片 2.将图片往水平和竖直方向,同时并按一定的速率移动 在实现的过程中,主要利用正弦函数 y=Asin(ωx+φ)+h ,设置四个 ...

  2. android录音波浪动画_Android 自定义波浪动画--让进度浪起来~

    waveview <Android 自定义波浪动画之"让进度浪起来~"> 转载请注明来自 傻小孩b_移动开发(http://www.jianshu.com/users/ ...

  3. android录音波浪动画_Android自定义View实现波浪动画

    本文实例为大家分享了Android自定义View实现波浪动画的具体代码,供大家参考,具体内容如下 效果演示 代码调用与实现效果 xml中调用 android:layout_width="ma ...

  4. android录音波浪动画_Android 自定义 view 实现波浪动画进度条

    最近在做项目时需要实现这样一种动画,类似于波浪形的进度动画,粗略的看了一下,发现好像类似于正余弦曲线实现的,但是Android 没有相关的API,所以需要我们动手画出来,所以现在在此记录一下学习过程, ...

  5. android录音波浪动画_Android实现波浪效果 - WaveView

    效果图 先上效果图 screenshot.gif 实现 WaveView的属性 WaveView的属性 Wate Level(水位) - 波浪静止时水面距离底部的高度 Amplitude(振幅) - ...

  6. android录音波浪动画_Android实现炫酷的波浪下载Loading动画

    1. 简介和效果分析 一直都觉得有很多loading动画挺炫酷的,然后自己看过一些之后也想实现一个,加强一下对绘制view的练习,能力有限,很多地方的实现的有欠考虑和逻辑优化,不管怎么样画了两天还是把 ...

  7. android录音波浪动画_Android语音输入的波浪效果 – WaveView

    效果展示 源码地址 实现思路 绘制正弦波形 水平移动波形,即可得到破浪效果. 正弦波形的绘制 private void createShader() { ... Bitmap bitmap = Bit ...

  8. android录音波浪动画_Android使用音频信息绘制动态波纹

    在一些音乐类应用中, 经常会展示随着节奏上下起伏的波纹信息, 这些波纹形象地传达了声音信息, 可以提升用户体验, 那么是如何实现的呢? 可以使用Visualizer类获取当前播放的声音信息, 并绘制在 ...

  9. android咖啡动画,WaveLineView 一款性能内存友好的录音波浪动画

    WaveLineView 一款内存友好的录音漂亮的波浪动画 效果图(实际效果更好) Usage Step1 allprojects { repositories { ... maven { url ' ...

最新文章

  1. oracle精度制的数据类型,ORACLE 中NUMBER 类型 低精度转换成高精度
  2. 在MVC框架上定时执行某种操作
  3. Spring Boot(四)Accessing application arguments
  4. 大学python和vb哪个简单-python和vb哪个简单
  5. Basic REST API Design
  6. CVPR2020最全整理:分方向论文下载,Github源码、论文解读等[计算机视觉][目标检测]
  7. Mac OS使用技巧之十五:快捷方便的Mini Dock
  8. 判断字符串中有多少汉字
  9. 面试题 01.06. 字符串压缩
  10. 排序算法与常见数据结构
  11. 图像空域增强:灰度映射法
  12. python 论文降重_我用Python写了一个论文降重工具-Go语言中文社区
  13. 世界上最神奇的网站收录--不是最无聊就是最有意思
  14. ubuntu系统如何连接到服务器,远程ubuntu系统怎么连接到服务器
  15. 暗黑精灵4黑苹果安装纪录
  16. YX2811景观装鉓驱动IC
  17. 使用驱动程序点亮LED灯
  18. Duplicate File Finder for Mac(重复文件查找工具)
  19. 美元指数站稳脚跟,下周耶伦再掀风暴
  20. 寒武纪论文DianNao、DaDianNao、ShiDianNao赠送

热门文章

  1. 公司宣传片拍摄文案怎么写?
  2. shp系列(七)——利用C++进行Shx文件的写(创建)
  3. NOIP2020总结
  4. c语言埃拉托色尼筛选法数组,埃拉托色尼筛选法 算法
  5. 2022年跨境电商卖家如何在Facebook上做广告【完整指南】
  6. python计算AUC、Accuracy、Recall、Precision和PPV
  7. Actor模型和CSP模型的区别
  8. 初中八年级计算机课程计划,初中信息技术教学计划
  9. Lumiprobe 活性染料丨氨基染料:花青5胺
  10. 启动某个程序的时候,提示端口8000被占用解决方式