概述 SoundPool
一个声音播放的辅助类,从名字可以看出,它具有 “池”的能力(缓存),它先加载声音文件到内存,以支持多次播放声音文件。
特点
- SoundPool适合 短小的 声音文件
- SoundPool适合播放 “需要多次播放的提示音”,比如在 一些常用的 请登录,请点击什么的
- 相比mediaPlayer,耗用资源更少
- 支持 同时 播放多个声音
使用方法
创建实例
mSoundPool = new SoundPool(1, AudioManager.STREAM_ALARM, 0);soundPoolMap = new HashMap<Integer, Integer>(); //这里我创建一个 hash 表,用于记录加载过的声音的ID,一般我们会定义一个常量作为检索该声音的KEY
加载声音文件
soundPoolMap.put(KEY_SOUND_A1, mSoundPool.load(this, R.raw.a1, 1));soundPoolMap.put(KEY_SOUND_A2, mSoundPool.load(this, R.raw.a2, 1));//注意,这里 hash表里 记录
播放声音文件
mSoundPool.play(soundPoolMap.get(KEY_SOUND_A1), 1, 1, 0, 0, 1); //注意,这里从hash表里取出了具体的ID
注册一个监听器,在加载声音完毕的时候获得消息
mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {@Overridepublic void onLoadComplete(SoundPool soundPool, int sampleId, int status) {alert(" " + sampleId);}});
代码
下面是完整的类的代码
package demo.vir56k.soundpooldemo;import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;import java.util.HashMap;public class MainActivity extends AppCompatActivity {public static final int KEY_SOUND_A1 = 1;public static final int KEY_SOUND_A2 = 1;SoundPool mSoundPool;private HashMap<Integer, Integer> soundPoolMap;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mSoundPool = new SoundPool(1, AudioManager.STREAM_ALARM, 0);mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {@Overridepublic void onLoadComplete(SoundPool soundPool, int sampleId, int status) {alert(" " + sampleId);}});soundPoolMap = new HashMap<Integer, Integer>();soundPoolMap.put(KEY_SOUND_A1, mSoundPool.load(this, R.raw.a1, 1));soundPoolMap.put(KEY_SOUND_A2, mSoundPool.load(this, R.raw.a2, 1));}private void alert(String s) {Log.i("Alert: ", s + "");}public void onClickView(View view) {if (view.getId() == R.id.button) {mSoundPool.play(soundPoolMap.get(KEY_SOUND_A1), 1, 1, 0, 0, 1);}if (view.getId() == R.id.button2) {mSoundPool.play(soundPoolMap.get(KEY_SOUND_A2), 1, 1, 0, 0, 1);}}}