我们先看看效果图:
功能:
点击begin 对着屏幕下方吹一口气 屏幕中会出现雪花飘 所有雪花离开屏幕后,恢复正常
实现:
用户点击按钮后,如果没有开始record线程,我们会开始线程去监听AudioRecord中声音状态,否则会停止当前的监听。 代码:
public void onClick(View v) {
if (recordThread == null || recordThread.getRecordStatus()) {
btnBlow.setText("Stop");
tvDisplay.setText("试试对着电话底部吹一吹吧");
recordThread = new RecordThread(handler, 1); // 点击按钮,启动线程
recordThread.start();
snowView.setStatus(false);
} else {
btnBlow.setText("Begin");
recordThread.stopRecord();
}
}
在监听过程,打开AudioRecord,如果在规定时间(100)内,平均音量大于设定值(默认40,可自行设置)。则触发事件:
public void run() {
System.out.println("RUN");
stop = false;
try {
audioRecord.startRecording();
// 用于读取的 buffer
byte[] buffer = new byte[bufferSize];
int total = 0;
int number = 0;
while (!stop) {
number++;
sleep(8);
long currenttime = System.currentTimeMillis();
int r = audioRecord.read(buffer, 0, bufferSize) + 1;// 读取到的数据
int v = 0;
for (int i = 0; i < buffer.length; i++) {
v += Math.abs(buffer[i]);//取绝对值,因为可能为负
}
int value = Integer.valueOf(v / r);//算得当前所有值的平均值
System.out.println("value:" + value);
total = total + value;
long endtime = System.currentTimeMillis();
long time = endtime - currenttime;
//如果时间大于100毫秒并且次数多于5次
if (time >= 100 || number > 5) {
int tmp = total / number;
total = 0;
number = 0;
//声音的大小达到一定的值
if (tmp > BLOW_BOUNDARY) {
// 发送消息通知到界面 触发动画
// 利用传入的handler 给界面发送通知
handler.sendEmptyMessage(what);
number = 1;
time = 1;
}
}
}
audioRecord.stop();
audioRecord.release();
bufferSize = 100;
} catch (Exception e) {
e.printStackTrace();
}
}
触发吹一下的动作后,会通过 hander回调给界面 ,用于显示文字并且雪花开始飘啊飘
case 1:
// 接收到message后更新UI,并通过isblow停止线程
tvDisplay.setText("吹了一下:"+System.currentTimeMillis());
btnBlow.setText("Begin");
recordThread.stopRecord();
update();
break;
关于雪花的效果,我前面写过一个帖子:【Android实例】雪花飞舞
本实例中的雪花飞与前面文章里面的又不尽相同 ,一个是从下往上,一个是从上往下,大家可以结合起来看看。
源码下载地址:
===================