Android高仿iOS Messages声音播放波形效果
文接《Android低仿iOS Messages录音波形效果》。
上一次开发中,因为无法完美实现波形的收敛效果,因此只能算是一个低仿的版本。
声音波形效果对比之下,比较容易实现。
一、目标
实现声音播放的波形效果,为神马笔记增加录音及播放功能做准备。
二、功能分析
截图 | 描述 |
---|---|
停止时的波形显示为全白色。 | |
播放过程中,波形有暗变亮,以呈现进度。 |
三、实现效果
基本上实现了播放的波形效果。
四、实现过程
1. 创建波形
绘制波形的前提条件是有波形数据。
波形数据的来源有2种。
- 从音频文件读取数据,然后转换为波形数据
- 录音时进行采样保存
通过MediaRecorder
实现录音时,通过getMaxAmplitude()
获取最近最大的振幅,通过一段时间的连续调用,最终可以组成一个波形数据。
有了波形数据后,还需要根据控件大小转换为目标数据。
2. Waveform
从波形数据创建Waveform
,用来显示完整波形。
sample()
是Waveform
的核心方法,实现转换波形数据的功能。
/**
*
*/
private static class Waveform {
ArrayList<Wave> list;
ArrayList<Wave> recycler;
TapePlayView parent;
Waveform(TapePlayView parent) {
this.parent = parent;
this.list = new ArrayList<>(100);
this.recycler = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
recycler.add(new Wave());
}
}
void clear() {
this.recycler.addAll(list);
list.clear();
}
void sample() {
this.recycler.addAll(list);
this.list.clear();
int count = parent.getWidth() / parent.getWaveWidth();
if (count &#