在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高、延迟时间较长、不支持多个音频同时播放等。这些缺点决定了MediaPlayer在某些场合的使用情况不会很理想,例如在对时间精准度要求相对较高的游戏开发中。
在游戏开发中我们经常需要播放一些游戏音效(比如:子弹爆炸,物体撞击等),这些音效的共同特点是短促、密集、延迟程度小。在这样的场景下,我们可以使用SoundPool代替MediaPlayer来播放这些音效。
SoundPool —— 适合短促且对反应速度比较高的情况(游戏音效或按键声等)一个SoundPool能同时管理多个音频,所以可以通过多次调用load函数来记载,如果记载成功将返回一个非0的soundID ,用于播放时指定特定的音频。
1> 往项目的res/raw目录中放入音效文件。。例R.raw.alter,是我放入的音频
2> 新建SoundPool对象,然后调用SoundPool.load()加载音效,调用SoundPool.play()方法播放指定音效文件
private SoundPool soundPool;
//指定声音池的最大音频流数目为1,声音品质为0
soundPool=new SoundPool(1, AudioManager.STREAM_SYSTEM,0);
//通过指定的路径加载 其中的第三个参数目前没有效果,建议设置为1。返回当前音频在音频池的id
final int id=soundPool.load(this, R.raw.alter, 1);
Button sound=(Button)findViewById(R.id.soundbutton);
sound.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
/*
* 播放音频,
* 第一个参数为声音池中音频的id
* 第二个参数为左声道音量;
* 第三个参数为右声道音量;
* 第四个参数为优先级;
* 第五个参数为循环次数,0不循环,-1循环;
* 第六个参数为速率,速率最低0.5最高为2,1代表正常速度
*/
soundPool.play(id, 1, 1, 0, 0,1);
}
});