即时音效,顾名思义,是一个又短又快的音效,适合于播放时间较短反应迅速的音频文件,例如输入法打字时的“哒哒”声就是这个东西,下象棋时的下棋声也是...
该技术继承自android.media.SoundPool
SoundPool类用于和播放应用程序的声音资源,该类将声音文件加载到内存中,处于性能的考虑,一般只将时间小于7秒左右的声音文件用该技术播放。
构造方法SoundPool(int maxStreams, int streamType, int srcQuality)
- maxStreams:该参数用于设置同时能够播放多少音效,如设置为3,则最多同时可以播放3个音效
- streamType:音频类型,在游戏中通常设置为STREAM_MUSIC
- srcQuality:音频文件的质量,默认设置为0
加载音频文件public int load(Context context, int resId, int priority)
- context:应用程序上下文,即调用它的Activity
- resId:资源id
- priority:优先级,可以设置为1
播放音效public final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
- soundID:播放的音乐ID
- leftVolume:用来控制左声道音量
- rightVolume:用来控制右声道音量
- priority:优先级,0最低
- loop:循环次数,0为不循环,-1为永远循环
- rate:回放速度,该值在0.5-2.0之间,1为正常速度
暂定播放public final void pause(int streamID)
- streamID音效ID
下面是应用这个即时音效的一个例子
package com.loulijun.quicksound; import java.util.HashMap; import android.app.Activity; import android.media.AudioManager; import android.media.SoundPool; import android.os.Bundle; import android.view.View; import android.widget.Button; public class QuickSoundActivity extends Activity { //创建一个声音池 private SoundPool sp; HashMap<Integer, Integer> map; private Button startOne = null; private Button stopOne = null; private Button startTwo = null; private Button stopTwo = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //初始化声音池 initSoundPool(); startOne = (Button)findViewById(R.id.startone); stopOne = (Button)findViewById(R.id.stopone); startTwo = (Button)findViewById(R.id.starttwo); stopTwo = (Button)findViewById(R.id.stoptwo); startOne.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { playSound(1,1);//播放第一首音效,循环一遍 } }); stopOne.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { //暂停第一首音效 sp.pause(map.get(1)); } }); startTwo.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { //播放第二首音效,循环两次 playSound(2,2); } }); stopTwo.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { //暂定第二首音效 sp.pause(map.get(2)); } }); } //声音池初始化方法 private void initSoundPool() { sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0); map = new HashMap<Integer, Integer>(); map.put(1, sp.load(this, R.raw.one, 1)); map.put(2, sp.load(this, R.raw.two, 1)); } //播放声音方法 public void playSound(int sound, int number) { AudioManager am = (AudioManager)this.getSystemService(this.AUDIO_SERVICE); //返回当前AlarmManager最大音量 float audioMaxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); //返回当前AudioManager对象的音量值 float audioCurrentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC); float volumnRatio = audioCurrentVolume/audioMaxVolume; sp.play( map.get(sound), //播放的音乐Id volumnRatio, //左声道音量 volumnRatio, //右声道音量 1, //优先级,0为最低 number, //循环次数,0无不循环,-1无永远循环 1);//回放速度,值在0.5-2.0之间,1为正常速度 } }