仿微信语音 WaveView 实现

背景

之前项目里需要加入语音输入的功能,在 UI 上需要参考微信做一个随音量变化而跳动的音频 WaveView。找了很久,没有找到特别好的,于是自己实现一个。

效果比业界大多数的 IM 应用、ChatBot 应用的语音输入音频 WaveView 要更好。我看了大部分业界其他应用的实现,很多要么是伪动画(不随音量变化而变化),要么过于僵硬或者整齐,要么不支持低音量时的缓动。

效果展示

正常收音效果

gif的帧数不够,非常不流畅。可以直接去这里看录屏:www.bilibili.com/video/BV1rL...

缓动效果

代码仓库

github.com/ultimateHan...

如何使用

目前已经发布到 maven central: central.sonatype.com/artifact/io...

  • 在 Android 项目中引入依赖: io.github.ultimatehandsomeboy666:soundwavelib:1.0.0

  • 在 xml 中指定想要设置的属性:

attr
volumeCount 全部的音柱数量
volumeIdleCount 参与缓动的音柱数量
minVolume 定义最小音量,当低于最小音量时,就会进入缓动状态
maxVolume 定义最大音量
danceDuration 跳动一次的时长
maxDanceDelay 音柱跳动的相位差,这个值越大,音柱跳动越不整齐。为0则所有音柱同步跳动
idleDuration 缓动一整次的时长,这个值越大,缓动得越慢;越小越快
minVolumeBarHeight 跳动音柱的最小高度
maxVolumeBarHeight 跳动音柱的最大高度
minVolumeBarHeight 跳动音柱的最小高度
volumeBarMargin 音柱之间的间距
volumeBarHalfWidth 音柱的一半宽度
volumeBarColor 音柱的颜色
  • 代码中还可以调用的一些方法:

setIdleHeightGetter(idleHeightGetter: (x: Int) -> Float):设置缓动的波形,x 代表当前时刻在缓动的音柱 index。比如想要一个曲线缓动,传入一个二次函数即可。

enableIdle(enable: Boolean):设置是否支持缓动

setDistribution(distribution: FloatArray):设置音柱高度分布。按需求将音柱高度设置得更加错落,比如两边相对低,中间相对高。

handleVolume(newVolume: Int):音柱跳动的入口方法,在监听音量的地方将调用该方法将音量传入,就会绘制跳动的 wave 啦。

总结

总的来说,代码不复杂,400多行。个人感觉效果确实挺不错的。如果有更多自定义需求,也可以把代码 copy 到项目里自己修改。

相关推荐
梦曦i2 小时前
@meng-xi/create-uni-app vs unibest:轻量脚手架与重型框架的定位之争
前端·uni-app
平头哥技术团队2 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
乌恩大侠2 小时前
GH200 新增 NVMe SSD 分区、格式化与挂载完整流程
运维·服务器·前端
yume_sibai2 小时前
Element Plus 数据展示组件完全指南(15个核心组件)
前端·javascript·vue.js
冬木家居3 小时前
40㎡客厅变形记,小家住出大自由[特殊字符]
android·经验分享·笔记·智能家居·微信公众平台
qiuhaipeng13 小时前
Claude code 升级后上下文长度变短问题
java·前端·数据库
zzz_23683 小时前
个人 AI 记忆如何跨工具复用:用 Markdown、索引和 Skill 搭一个可治理的记忆库
前端·人工智能·react.js·前端框架·agent·agent测评
AFinalStone3 小时前
Android 7系统无障碍服务(六)输入事件拦截与 TouchExplorer
android·无障碍服务
天空之城--3 小时前
MT管理器Android逆向工程完全指南:从入门到实战
android
Anhty5 小时前
2026九月最新变声器测评:iOS安卓双端适配,低延迟运行更稳定
android·人工智能·功能测试·ios·智能手机