上个月使用了一次SoundPool用来仿一款背单词app,最近突然想起来,还是趁现在记得,赶紧记下来
1.首先先创建一个SoundPool的实例:
SoundPool soundPool = new SoundPool.Builder().setMaxStreams(1).build();
//.setMaxStreams(1)代表最大可同时播放几个音频流,我这设置的是1
//还有个.setAudioAttributes(xxx)方法,说实话我也不知道有什么鸟用,网上也查不到,反正我没设置它
2.加载音频资源
soundPool.load(wordFile.toString(), 1); //从文件加载音频
//第一个参数是文件的位置,用字符串表示
//第二个参数我就日了狗了,官方文档中注明: the priority of the sound. Currently has no effect.Use a value of 1 for future compatibility.
//妈的,没用你特么设计这个参数干毛!,不管怎么样,我们传入1就好
public int load(Context context, int resId, int priority) //这个是从资源文件中加载音频,我没使用,看起来蛮简单的
3.播放音频文件
public final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
//第一个参数soundID 就是我们加载完文件(load方法)时返回的int型数字,必须填加载过的数字
//第二个参数leftVolume 左声道音量
//第三个参数rightVolume 右声道音量
//第四个参数priority 播放声音的优先级
//第五个参数loop 声音重复的次数, 0代表不循环, -1代表无限循环
//第六个参数rate 声音播放的速度, 1.0代表正常速度, 取值范围为0.5~2.0 //这个不错哦
//返回值 如果是个非0的值代表播放成功,如果0代表播放失败
/** 翻译下这个方法的部分官方说明:
* | 播放指定soundID的声音,这个soundID是load()方法返回的值
* | play()方法返回值如果是非0的值表示播放成功,如果是0表示失败,这个值可以用做重放
* | 注意: 如果正在播放的声音数超过了播放的最大限制数,使用play()方法可能造成另一个声音被停止
* |
* | loop值如果为0表示只播放一次,如果-1表示无限重复,如果是其他值表示重复的次数
* | 例如: loop = 0, 正常播放1次, 重复0次, 总共播放一次
* | loop = 1, 正常播放1次, 重复1次, 总共播放2次
* | loop = 99, 正常播放1次, 重复99次, 总共播放100次
*/
4.释放资源
(1)释放指定资源:
public native final boolean unload(int soundID);
//指定soundID的声音资源将不能再使用
(2)释放所有资源:
public final void release()
//释放加载的所有资源,释放后就不能再播放了,而且应该将SoundPool的引用设为null
5.使用心得:
我想了想还是有必要要传授给大家一点人生经验
1.如果加载的资源太多了,超过了SoundPool的内存限制(具体多少我不是很清楚,但网上都说是1M),那么最先加载的资源将不再可用. 就像一个队列的数据结构一样,先进先出.
2.如果资源文件不多,但需要重复播放
//这种情况可以用一个map将load()得到的soundID保存下来,以便下次使用,例如:
Map<String, Integer> map = new HashMap()
int soundID = soundPool.load(wordFile.toString(), 1);
String key = "打飞机的声音"
map.put(key, soundID);
//这样可以重复利用已经加载过的声音资源
3.如果资源很多,每个声音播放的次数很少
//这种情况换句话说就是,每个资源加载一次就不再使用了,那么只需要在加载的时候播放就行
使用SoundPool.OnLoadCompleteListener,在加载成功后的回调中播放就行
/**
* Called when a sound has completed loading.
*
* @param soundPool SoundPool object from the load() method
* @param sampleId the sample ID of the sound loaded.
* @param status the status of the load operation (0 = success)
*/
public void onLoadComplete(SoundPool soundPool, int sampleId, int status);
//上面的参数中sampleId,就是加载资源的soundID.
//在这个方法中使用play()方法就行
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
soundPool.play(sampleId, 1, 1, 1, 0, 1);
}
以上