前提:很久没有更新了,今天就为大家带来一个画布和SurfaceView的使用吧。(附源码资源)

需求:录制音频时有时候为了增加与用户的体验,我们需要增加与用户的交互,于是就有了录音动画。如下图

分析:录音动画有很多种,比如话筒式的,如微信语音和QQ语音,相对于简单一些,只需几张图片根据音量大小来回切换,这里就不多说了。还有就是类似于心电图,根据音量大小实现及时画出波形图,而这篇文章就能解决以上需求,好了,废话不多说,直接上代码。

首先我们需要建立一个简单的录音界面,如图

activity_test_surface_view.xml如下

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin" ><SurfaceViewandroid:id="@+id/record_surfaceView"android:layout_width="match_parent"android:layout_height="100dp"android:layout_gravity="center_horizontal"android:background="@color/acoustic_wave_bg" /><Buttonandroid:layout_below="@id/record_surfaceView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="录音" android:onClick="Record"/></RelativeLayout>

接下来就是代码的实现了,首先获取视图和初始化画笔,代码如下

// 初始化视图private void initView() {sfv = (SurfaceView) findViewById(R.id.record_surfaceView);sfv.setZOrderOnTop(true);sfv.getHolder().setFormat(PixelFormat.TRANSLUCENT);}
 protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_test_surface_view);initView();// 初始化画笔mPaint = new Paint();mPaint.setColor(getResources().getColor(R.color.maincolor));// 画笔为主色调mPaint.setStrokeWidth(4);// 设置画笔粗细}

做完这俩件事后就是录音的点击事件,具体可以查看以下代码,代码注释也很详细,如有不懂,可留言,我会及时回复

public void Record(View view) {baseLine = sfv.getHeight() / 2;if (mediarecord == null) {//判断文件是否存在,如果存在则删除File file = new File("mnt/sdcard/a123" + ".m4a");if (file.exists()) {file.delete();}//初始化<span style="font-family: Arial, Helvetica, sans-serif;">MediaRecorder</span>mediarecord = new MediaRecorder();
                        //设置<span style="font-family: Arial, Helvetica, sans-serif;">MediaRecorder的属性</span>mediarecord.setAudioSource(MediaRecorder.AudioSource.MIC);mediarecord.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);mediarecord.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);mediarecord.setOutputFile("mnt/sdcard/a123" + ".m4a");try {//准备mediarecord.prepare();} catch (IOException e) {Log.e("iii", "prepare() failed");}
                        //开始录制mediarecord.start();//开启画笔线程每0.2绘制一次sfvtimer = new Timer();sfvtimer.schedule(new TimerTask() {@Overridepublic void run() {Message message = new Message();message.what = 1;mHandler.sendMessage(message);}}, 0, 200);// 录音} else {if (mediarecord != null) {mediarecord.stop();mediarecord.reset();mediarecord.release();mediarecord = null;sfvtimer.cancel();sfvtimer = null;}}

绘制线程代码如下

private final Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubupdateMicStatus();}};

updateMicStatus()方法如下:

if (mediarecord != null) {double ratio = (double) mediarecord.getMaxAmplitude() / BASE;int db = 0;// 分贝if (ratio > 1)db = (int) (20 * Math.log10(ratio)) - 50;if (db < 0)db = 0;x.add(-db);//保存音频分贝大小,根据X里的值绘制一段完整的波浪线if (x.size() > sfv.getWidth() / divider) {x.remove(0);//如果长达超出了屏幕宽度则删除第一个数据}SimpleDraw(x, baseLine);}

绘制画板如下:

if (rateY == 0) {rateY = 200 / sfv.getHeight();baseLine = sfv.getHeight() / 2;}Canvas canvas = sfv.getHolder().lockCanvas(new Rect(0, 0, sfv.getWidth(), sfv.getHeight()));// 关键:获取画布canvas.drawColor(getResources().getColor(R.color.acoustic_wave_bg));// 清除背景int start = sfv.getWidth() - buf.size() * divider;int py = baseLine;if (buf.size() > 0)py += buf.get(0) / rateY;int y;canvas.drawLine(0, baseLine, start - divider, baseLine, mPaint);for (int i = 0; i < buf.size(); i++) {y = buf.get(i) / rateY + baseLine;// 调节缩小比例,调节基准线canvas.drawLine(start + (i - 1) * divider, py, start + i * divider,y, mPaint);py = y;}sfv.getHolder().unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像

完成到这里就可以实现录音心电图了,效果图如下

不懂得可以留言或者自己下载资源慢慢研究,如有不足,希望大家指出,共同讨论,进步

Android根据音量大小绘制心电图(附源码)相关推荐

  1. python绘制球体_OpenGL三维球体数据生成与绘制【附源码】

    OpenGL三维球体数据生成与绘制源码: #include #include #include #include #include #include #include #include #includ ...

  2. 暑期Android游戏开发——小兔子跳铃铛(附源码)

    暑期Android游戏开发--小兔子跳铃铛(附源码) 一. 背景说明 我在南京的一所高校学习软件工程.学院里每年会举行一次"创新杯"软件比赛,鼓励同学自主学习和创新.我和几个好兄弟 ...

  3. Android使用GridView实现俄罗斯方块(附源码)(三)

    GitHub地址: https://github.com/weijifen/AndroidTetris 移动方向 移动方向包括左移,右移和下移. 移动方块实际是对position向量做改变,改变之后使 ...

  4. Android 实现播放网络视频 内容附源码下载链接

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  5. 基于Android的健身系统-计算机毕设 附源码90470

    基于Android的健身系统 目  录 摘要 1 1 绪论 1 1.1 课题研究的背景与意义 1 1.2研究的目的与研究内容 1 1.3本文主要工作 1 2基于Android的手机健身系统系统分析 3 ...

  6. Android小项目之---选择对话框(附源码)

    还记得早先我们做的记算器的例子吗?当中的验证判断用到了对话框,今天我们来做一个不一样的对话框,要做的这个小例子是一个可供选择效果的对话框即层层迭迭的Alert Dialog:界面方面我们摆放一个But ...

  7. Android串口编程--开关灯Demo(附源码)

    1.项目简述 第二次玩硬件了,第一次是通过局域网控制门的开关,这次是通过ZB(大概就是这么叫,具体名字不清楚)控制灯的开关,感觉控制硬件也就是给硬件发个byte数组而已. 这里有个框架usb-seri ...

  8. Android串口通信实例分析【附源码】

    Android 串口通信实例分析,用的时开源的android-serialport-api 这个是用android ndk实现的串口通信,我把他做了一个简化,适合于一般的程序的串口通信移植,欢迎拍砖- ...

  9. 几款不错的Android开源APP效果展示(附源码地址)

    在逛gitHub时,发现了很多不错的Android开源模板,做一次搬运工,大家有需要的可以点链接进去学习一下. 1,很炫酷的activity跳转动画效果   gitHub地址:https://gith ...

最新文章

  1. 为什么线程被唤醒后锁会被抢?
  2. 【Linux 内核】Linux 内核源码几个重要的入口源文件及函数介绍 ( 系统初始化 | 内存管理 | 虚拟文件系统 | 网络管理 )
  3. python网络编程—TCP协议(二)
  4. Thymeleaf显示表格
  5. 转:3d max 2013 安装教程,凭着一种互联网精神提供给广大朋友
  6. 好久不更新这个博客了。
  7. 绝对不忽悠、暑期择机功能该咋选?
  8. [js] 使用js实现一个循环队列
  9. no判断 python yes_Python 内置类型全解析(1)
  10. nginx事件 -- 第六篇 stale event
  11. WDS+MDT网络部署操作系统
  12. 公司办公用品管理软件(AssetManage 2011) v11.0.3破解版
  13. win7系统下使用虚拟机安装专利电子申请客户端(CPC软件)以及专利文件生成过程
  14. 开帖记录每天工作学习日常
  15. Spring Cloud Alibaba教程:使用Nacos作为配置中心
  16. 数学建模学习笔记——预测类型1
  17. uni-app小程序利用动画做出左右滑动切换的效果
  18. python列表lambda表达式排序sort(key=lambda x:x[1])
  19. opencv计算指定区域黑白像素占比
  20. Three.js - SpotLight 光源

热门文章

  1. css3新动_10款重量级CSS3的全新特效 实现超酷前端动画效果
  2. 面试技巧---白话文
  3. signature=2850cfcfebaece38f3ee6f56047eb922,A characteristic metabolic signature of breast cancer
  4. 教老婆学java系列之奇妙的数据结构四
  5. java 100%3.0_java经典选择题100例及答案
  6. requests框架详解
  7. 总结一下自己的linux历程
  8. <C语言>诸葛亮猜数算法(二分法)
  9. 香蕉派 BPI-M2 Zero 四核开源单板计算机 全志 H2+/H3 芯片 高端设计
  10. Android智能硬件开发心得总结(二)