android录音波浪动画_Android语音输入的波浪效果 – WaveView
效果展示
源码地址
实现思路
绘制正弦波形
水平移动波形,即可得到破浪效果。
正弦波形的绘制
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相关推荐
- android录音波浪动画_Android自定义View实现波浪动画
本文实例为大家分享了Android自定义View实现波浪动画的具体代码,供大家参考,具体内容如下 效果演示 代码调用与实现效果 xml中调用 android:layout_width="ma ...
- android录音波浪动画_Android 自定义 view 实现波浪动画进度条
最近在做项目时需要实现这样一种动画,类似于波浪形的进度动画,粗略的看了一下,发现好像类似于正余弦曲线实现的,但是Android 没有相关的API,所以需要我们动手画出来,所以现在在此记录一下学习过程, ...
- android手机设置中的语音输入与输出
android手机设置中的语音输入与输出: 设置--语音输入与输出--文字转语音设置--安装语音数据库 在电子市场下载安装,安装成功后,将键盘改为Android键盘,就会看到一个麦克风一样的图标,点击 ...
- android 滑动缩放监听,基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放...
基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放 基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放和透明效果) 在上一个项目的基础上做修改,项目 ...
- android录音波浪动画_Android 自定义波浪动画--让进度浪起来~
waveview <Android 自定义波浪动画之"让进度浪起来~"> 转载请注明来自 傻小孩b_移动开发(http://www.jianshu.com/users/ ...
- android上使用蓝牙设备进行语音输入
主要实现步骤如下: 1.确保已经和蓝牙耳机配对连接上. 2.开启蓝牙信道 AudioManager mAudioManager = (AudioManager)getSystemService(Con ...
- android edittext限制字节_android EditText输入限制
zyz 发表于 2012-5-30 18:19:03 android EditText输入限制 android:digits="1234567890.+-*/%\n()" 限制输入 ...
- android 同根动画_android 动画系列 (1) - tween 动画(view动画)
这是我这个系列的目录,有兴趣的可以看下: android 动画系列 - 目录 tween 动画早些时候我们也叫补间动画(我也不知道为啥),现在也有叫 view 动画的.tween动画是2.X 时代的产 ...
- android共享元素动画_Android共享元素过渡动画
android共享元素动画 In this tutorial we'll implement a different kind of animation transition namely Share ...
最新文章
- sql 2005提示未能加载包Microsoft SQL Management Studio Package
- 用ram实现寄存器堆_纯C语言实现bootloader
- java的mvc实训报告_javaweb实验报告——MVC.docx
- MySQL(四)复合查询与联合查询
- vb treeview 展开子节点_C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形
- excel实战应用案例100讲(一)-用Excel实现表格提交、查询与新建
- [转载]PSCAD调用MATLAB/SIMULINK之接口元件设计
- js数组去重的4个方法
- golang slice分割和append copy还是引用
- C语言入门(20)——使用VC2013对C语言进行调试
- KnockoutJs dynamic Binding
- Linux中参数命令有的是一个横杠有的是两个横杠的区别
- UI设计中置灰功能总结
- c语言中的正弦函数与余弦函数
- JAVA中GUI在Button中设置显示文字时中文乱码问题
- Java mail 535鉴权失败或启动报错
- 对一个注册页面编写测试用例
- python3爬虫学习笔记之模拟淘宝登录
- 【徐禾 政治经济学概论】 读书笔记 §1.3劳动的二因素:具体劳动和抽象劳动(下.价值量的规定性)
- 阿里图标在IE浏览器上不显示的问题