某日用微信语音功能聊天,发现当我使用语音功能时,会弹出一个窗口,窗口中间有一个控件会实时的显示我说话声音的大小(即分贝)。当时觉得挺好玩,决定也仿制一个,效果如下

分析控件显示效果,可判断左边是一个imgview,右边是一个可以根据实时音量大小绘制梯度显示的自定义view。那就先解决这个自定义view。
我们可以把这个自定义view看成是一个上宽下窄的梯形,而且在纵向上等间距的着墨绘制。用一张图或许可以更好的表示。

上图是一个在笛卡尔坐标系中的梯形图,上底下底平行于X轴,startX对应的点是斜线的出发点,斜线在x轴方向上的偏移量mDx与y轴上偏移量mDy的关系mDx=K*mDy;mDyFill对应的区域是着墨区,mDyEmpty对应的是空白区,且mDy=mDyFill+mDyEmpty.我们可以通过修改以上数值进而修改着墨的区域。因为该自定义view不会在多处使用,所以不设置自定义属性,直接在代码中修改。贴下部分代码:

        //dp转pxmStartX= DensityUtils.dp2px(context,10);mDx = DensityUtils.dp2px(context,4);//mDy=3*mDxmDyFill = DensityUtils.dp2px(context,8);mDyEmpty = DensityUtils.dp2px(context,4);mDy=mDyEmpty+mDyFill;

我们可以把着墨区域看成是从一个完整梯形从下至上等间距截取下来的,因为实时音量分贝(音量大小单位)的不同,截取的次数mCurNum也会不同。接下来是绘制相关的代码

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mWidth = getMeasuredWidth();mHeight = getMeasuredHeight();//可以绘制的着墨区域的最大数int numDesignY=mHeight/mDy;int numDesignX=(mWidth-mStartX)/mDx;mNumMax = Math.min(numDesignX,numDesignY);//init penmPaint.setColor(Color.BLACK);mPaint.setStyle(Paint.Style.FILL);mPaint.setAntiAlias(true);mPaint.setStrokeWidth(1);//绘制多边形Path path=null;for (int i = 0; i < mCurNum; i++) {path=new Path();path.moveTo(0,mHeight-i*(mDy));path.lineTo(0,mHeight-(mDyFill+i*(mDy)));path.lineTo(mStartX+i*mDx+mDx,mHeight-(mDyFill+i*(mDy)));path.lineTo(mStartX+i*mDx,mHeight-i*(mDy));path.close();canvas.drawPath(path,mPaint);}}

采用命令模式更新mCurNum的值,令自定义view实现如下接口:

/*** 分贝百分比监听,默认初始值为60,最大值90*/public interface FractionListener{/*** 传入当前增长分贝的百分比进度* @param curFraction*/public void updateFraction(double curFraction);}

实现接口

/*** 设置当前可描绘层数,then 重绘*/@Overridepublic void updateFraction(double curFraction) {mCurNum = (int) (curFraction*mNumMax);postInvalidate();}

检测当前分贝后调用FractionListener.updateFraction方法,实现随分贝大小重新绘制。
关于如何获取android麦克风分贝的大小,请参考http://blog.csdn.net/pcaxb/article/details/47808675,感谢博主的文章。
如果你觉得这篇文章对你有用,那么赞一个吧<3<3 。
源码下载

Android 仿微信语音聊天音量大小显示控件相关推荐

  1. android 仿微信语音聊天

    android 仿微信语音聊天 跟着imooc老师学习 代码地址: https://github.com/tingsky9985/Weixin_Recorder

  2. Android仿微信语音聊天界面设计

    这篇文章主要为大家详细介绍了Android仿微信语音聊天界面设计代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 有段时间没有看视频了,昨天晚上抽了点空时间,又看了下鸿洋大神的视频教程,又抽时间 ...

  3. android仿微信语音聊天功能,Android仿微信发送语音消息的功能及示例代码

    微信的发送语音是有一个向上取消的,我们使用ontouchlistener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private mediaplayer mplayer ...

  4. Android仿微信语音聊天

    1.项目界面展示: 2.项目代码整体结构简析: (1)AudioRecorderButton类(录音按钮):State:STATE_NORMAL[正常状态].STATE_RECORDERING[正在录 ...

  5. Android仿微信语音聊天demo

    其实我接触android时间也不是很久,但是发现android远远比我们想象的要有趣并且复杂很多,所以还是要多花点时间来写一写这些demo例子,这个程序是我从慕课网上学来的,因为毕竟要自己手写,才能体 ...

  6. Android 仿微信语音聊天,正式加入字节跳动

    /** 恢复标志位 */ private void resetState() { isRecording = false; isReady = false; changeState(STATE_NOR ...

  7. Android 仿微信语音聊天,flutter项目结构

    4.录音类里有两个成员:录音长度,录音路径. 下面贴一下代码: 自定义Button package com.zms.wechatrecorder.view; import com.zms.wechat ...

  8. java实现仿微信app聊天功能_Android仿微信语音聊天功能

    本文实例讲述了Android仿微信语音聊天功能代码.分享给大家供大家参考.具体如下: 项目效果如下: 具体代码如下: AudioManager.java package com.xuliugen.we ...

  9. android高仿微信聊天页面,Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)

    目前的应用市场上,使用毛玻璃效果的APP随处可见,比如用过微信语音聊天的人可以发现,语音聊天页面就使用了高斯模糊效果. 先看下效果图: 仔细观察上图,我们可以发现,背景图以用户头像为模板,对其进行了高 ...

最新文章

  1. 基础知识巩固四(问题部分)
  2. 安全套接层Secure Sockets Layer,SSL
  3. 使用Spring和Hibernate进行集成测试有多酷
  4. windows10 C盘清理
  5. 蜂鸟开发板 linux,蜂鸟E203系列——Linux下运行hello world例程
  6. Maven 本地仓库访问私服
  7. python 3.6.5 shell_linux安装python3.6.5
  8. JAVA操作文件大全(一)
  9. 百度百城优品微信商城上线
  10. 无人机底层开发-MPU6050六轴传感器+磁力计初始化
  11. 《传习录》 学习笔记
  12. 教你微星电脑按f几重装系统
  13. 力扣刷题 DAY_74 回溯
  14. 2021最新 杭州互联网公司排名
  15. 02年六代雅阁的整备质量_雅阁对不起,我不能爱你。
  16. mysql集合运算_SQL基础教程(mick)学习
  17. 蓝桥寒假训练1-2013年第四届蓝桥杯省赛
  18. 【快递100接口BUG】数据库时区为0时区,而实际时区为东八区时间,导致存入时间多出八个小时
  19. oracle中12560,Oracle ORA-12560解决方法
  20. 怎么让抖音视频当做铃声android,抖音怎么提取视频里的音乐?怎么将抖音里的音乐用来做手机铃声?抖音视频提取音频的方法...

热门文章

  1. nba app android,NBA app官方版
  2. 小白的模拟电路初步学习20日打卡(2)
  3. 模仿学习(GMM-GMR应用)
  4. 干货分享!CynosDB for PostgreSQL 架构浅析
  5. 淋巴细胞转化中PHP的作用,淋巴细胞转化试验范围|意义
  6. Java诊断工具Arthas使用说明
  7. 我爱赚钱吧:“容易变穷的人”的3个特征,你身上有吗?
  8. Java实现 历史上的今天
  9. pwn刷题num45----fast fit
  10. 使用ArcPy实现创建ags文件