效果展示

源码地址

实现思路

绘制正弦波形

水平移动波形,即可得到破浪效果。

正弦波形的绘制

private void createShader() {

...

Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

// Draw default waves into the bitmap

// y=Asin(ωx+φ)+h

float waveX1 = 0;

final float wave2Shift = mDefaultWaveLength / 4;

final float endX = getWidth();

final float endY = getHeight();

...

for (int i = 0; i < listWaves.size(); i++) {

ItemWave itemWave = listWaves.get(i);

if (i == 0) {

wavePaint.setColor(itemWave.line_color);

for (int beginX = 0; beginX < endX; beginX++) {

double wx = beginX * mDefaultAngularFrequency;

float beginY = (float) (mDefaultWaterLevel + mDefaultAmplitude * Math.sin(wx));

float endY = beginY + itemWave.line_height;//波浪线的线条粗度

canvas.drawLine(beginX, beginY, beginX, endY, wavePaint);

waveY[beginX] = beginY;

}

} else {

wavePaint.setColor(itemWave.line_color);

final int wave2Shift = (int) (mDefaultWaveLength / itemWave.line_height);

for (int beginX = 0; beginX < endX; beginX++) {

float beginY = waveY[(beginX + wave2Shift) % endX];

float endY = beginY + itemWave.line_height;//波浪线的线条粗度

canvas.drawLine(beginX, beginY, beginX, endY, wavePaint);

}

}

}

// use the bitamp to create the shader

mWaveShader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.CLAMP);

mViewPaint.setShader(mWaveShader);

}

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

31

32

33

34

35

36

37

privatevoidcreateShader(){

...

Bitmapbitmap=Bitmap.createBitmap(getWidth(),getHeight(),Bitmap.Config.ARGB_8888);

Canvascanvas=newCanvas(bitmap);

//Drawdefaultwavesintothebitmap

//y=Asin(ωx+φ)+h

floatwaveX1=0;

finalfloatwave2Shift=mDefaultWaveLength/4;

finalfloatendX=getWidth();

finalfloatendY=getHeight();

...

for(inti=0;i

ItemWaveitemWave=listWaves.get(i);

if(i==0){

wavePaint.setColor(itemWave.line_color);

for(intbeginX=0;beginX

doublewx=beginX*mDefaultAngularFrequency;

floatbeginY=(float)(mDefaultWaterLevel+mDefaultAmplitude*Math.sin(wx));

floatendY=beginY+itemWave.line_height;//波浪线的线条粗度

canvas.drawLine(beginX,beginY,beginX,endY,wavePaint);

waveY[beginX]=beginY;

}

}else{

wavePaint.setColor(itemWave.line_color);

finalintwave2Shift=(int)(mDefaultWaveLength/itemWave.line_height);

for(intbeginX=0;beginX

floatbeginY=waveY[(beginX+wave2Shift)%endX];

floatendY=beginY+itemWave.line_height;//波浪线的线条粗度

canvas.drawLine(beginX,beginY,beginX,endY,wavePaint);

}

}

}

//usethebitamptocreatetheshader

mWaveShader=newBitmapShader(bitmap,Shader.TileMode.REPEAT,Shader.TileMode.CLAMP);

mViewPaint.setShader(mWaveShader);

}

首先一个长宽恰等于WaveView的Bitmap:Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888)。

在Bitmap中使用默认的属性绘制出初始波形。初始波形的属性:Wate Level(水位)为WaveView高度的1/2;Amplitude(振幅)为WaveView高度的1/20;Wave Length(波长)等于WaveView的宽度。

代码第 9 ~ 27 行进行初始波形的绘制。波形由我们传入的ArrayList所控制,不需要重复计算。

最后把这个Bitmap设置成为Paint的Shader。设置Shader相当于设定画笔的形状,使用设置了Shader的Paint绘制图形时,实际上是在使用Bitmap填充绘制的区域。X轴的填充方式为TileMode.REPEAT,即重复填充;Y轴的填充方式为TileMode.CLAMP,即使用边缘的色值延伸填充。

调整Bitmap的大小并填充到WaveView

有了初始波形,当WaveView的属性改变时,只需要对初始波形进行相应的拉伸/压缩和位移就可以得到用户想要的波形。

// first call after mShowWave, assign it to our paint

if (mViewPaint.getShader() == null) {

mViewPaint.setShader(mWaveShader);

}

// sacle shader according to mWaveLengthRatio and mAmplitudeRatio

// this decides the size(mWaveLengthRatio for width, mAmplitudeRatio for height) of waves

mShaderMatrix.setScale(

mWaveLengthRatio / DEFAULT_WAVE_LENGTH_RATIO,

mAmplitudeRatio / DEFAULT_AMPLITUDE_RATIO,

0,

mDefaultWaterLevel);

// translate shader according to mWaveShiftRatio and mWaterLevelRatio

// this decides the start position(mWaveShiftRatio for x, mWaterLevelRatio for y) of waves

mShaderMatrix.postTranslate(

mWaveShiftRatio * getWidth(),

(DEFAULT_WATER_LEVEL_RATIO - mWaterLevelRatio) * getHeight());

// assign matrix to invalidate the shader

mWaveShader.setLocalMatrix(mShaderMatrix);

canvas.drawRect(0, 0, getWidth(),

getHeight(), mViewPaint);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

//firstcallaftermShowWave,assignittoourpaint

if(mViewPaint.getShader()==null){

mViewPaint.setShader(mWaveShader);

}

//sacleshaderaccordingtomWaveLengthRatioandmAmplitudeRatio

//thisdecidesthesize(mWaveLengthRatioforwidth,mAmplitudeRatioforheight)ofwaves

mShaderMatrix.setScale(

mWaveLengthRatio/DEFAULT_WAVE_LENGTH_RATIO,

mAmplitudeRatio/DEFAULT_AMPLITUDE_RATIO,

0,

mDefaultWaterLevel);

//translateshaderaccordingtomWaveShiftRatioandmWaterLevelRatio

//thisdecidesthestartposition(mWaveShiftRatioforx,mWaterLevelRatiofory)ofwaves

mShaderMatrix.postTranslate(

mWaveShiftRatio*getWidth(),

(DEFAULT_WATER_LEVEL_RATIO-mWaterLevelRatio)*getHeight());

//assignmatrixtoinvalidatetheshader

mWaveShader.setLocalMatrix(mShaderMatrix);

canvas.drawRect(0,0,getWidth(),

getHeight(),mViewPaint);

代码 3 ~ 6 行对Shader进行拉伸/压缩,10 ~ 12 行对Shader进行水平/竖直平移。

代码 17 ~ 19 行用Shader填充成想要的形状。

平移动画

private void initAnimation() {

// horizontal animation. 平移动画,实现波浪效果

// wave waves infinitely.

ObjectAnimator waveShiftAnim = ObjectAnimator.ofFloat(

mWaveView, "waveShiftRatio", 0f, 1f);

waveShiftAnim.setRepeatCount(ValueAnimator.INFINITE);//Animation.INFINITE 表示重复多次

waveShiftAnim.setDuration(1000);

waveShiftAnim.setInterpolator(new LinearInterpolator());

mAnimatorSet = new AnimatorSet();

mAnimatorSet.play(waveShiftAnim);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

privatevoidinitAnimation(){

//horizontalanimation.平移动画,实现波浪效果

//wavewavesinfinitely.

ObjectAnimatorwaveShiftAnim=ObjectAnimator.ofFloat(

mWaveView,"waveShiftRatio",0f,1f);

waveShiftAnim.setRepeatCount(ValueAnimator.INFINITE);//Animation.INFINITE表示重复多次

waveShiftAnim.setDuration(1000);

waveShiftAnim.setInterpolator(newLinearInterpolator());

mAnimatorSet=newAnimatorSet();

mAnimatorSet.play(waveShiftAnim);

}

android录音波浪动画_Android语音输入的波浪效果 – WaveView相关推荐

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

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

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

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

  3. android手机设置中的语音输入与输出

    android手机设置中的语音输入与输出: 设置--语音输入与输出--文字转语音设置--安装语音数据库 在电子市场下载安装,安装成功后,将键盘改为Android键盘,就会看到一个麦克风一样的图标,点击 ...

  4. android 滑动缩放监听,基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放...

    基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放 基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放和透明效果) 在上一个项目的基础上做修改,项目 ...

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

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

  6. android上使用蓝牙设备进行语音输入

    主要实现步骤如下: 1.确保已经和蓝牙耳机配对连接上. 2.开启蓝牙信道 AudioManager mAudioManager = (AudioManager)getSystemService(Con ...

  7. android edittext限制字节_android EditText输入限制

    zyz 发表于 2012-5-30 18:19:03 android EditText输入限制 android:digits="1234567890.+-*/%\n()" 限制输入 ...

  8. android 同根动画_android 动画系列 (1) - tween 动画(view动画)

    这是我这个系列的目录,有兴趣的可以看下: android 动画系列 - 目录 tween 动画早些时候我们也叫补间动画(我也不知道为啥),现在也有叫 view 动画的.tween动画是2.X 时代的产 ...

  9. android共享元素动画_Android共享元素过渡动画

    android共享元素动画 In this tutorial we'll implement a different kind of animation transition namely Share ...

最新文章

  1. sql 2005提示未能加载包Microsoft SQL Management Studio Package
  2. 用ram实现寄存器堆_纯C语言实现bootloader
  3. java的mvc实训报告_javaweb实验报告——MVC.docx
  4. MySQL(四)复合查询与联合查询
  5. vb treeview 展开子节点_C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形
  6. excel实战应用案例100讲(一)-用Excel实现表格提交、查询与新建
  7. [转载]PSCAD调用MATLAB/SIMULINK之接口元件设计
  8. js数组去重的4个方法
  9. golang slice分割和append copy还是引用
  10. C语言入门(20)——使用VC2013对C语言进行调试
  11. KnockoutJs dynamic Binding
  12. Linux中参数命令有的是一个横杠有的是两个横杠的区别
  13. UI设计中置灰功能总结
  14. c语言中的正弦函数与余弦函数
  15. JAVA中GUI在Button中设置显示文字时中文乱码问题
  16. Java mail 535鉴权失败或启动报错
  17. 对一个注册页面编写测试用例
  18. python3爬虫学习笔记之模拟淘宝登录
  19. 【徐禾 政治经济学概论】 读书笔记 §1.3劳动的二因素:具体劳动和抽象劳动(下.价值量的规定性)
  20. 阿里图标在IE浏览器上不显示的问题

热门文章

  1. idea git rebase ---- 合并多个提交到某个分支(实用)
  2. Http请求:Google调用本地摄像头权限开启
  3. 不知道考研那些书比较好么?我来推荐~~~(二)
  4. MapReduce分布式编程模型
  5. java心跳监控服务_JavaHeartBeat-应用服务器心跳检测
  6. 广告平台的商业模式,行业分析
  7. 个人建设网站流程解说,手把手教你如何在阿里云上搭建自己的网站
  8. 《袁老师访谈录》第十八期-百万对话(2):漫漫创业路
  9. 常用的大数据技术有哪些?
  10. 目瞪狗呆:出轨率最高的竟是IT男