即時音效,顧名思義,是一個又短又快的音效,適合於播放時間較短反應迅速的音頻檔案,例如IME打字時的“噠噠”聲就是這個東西,下象棋時的下棋聲也是...
該技術繼承自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)
下面是應用這個即時音效的一個例子
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() {@Overridepublic void onClick(View v) {playSound(1,1);//播放第一首音效,迴圈一遍} }); stopOne.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {//暫停第一首音效sp.pause(map.get(1));} }); startTwo.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {//播放第二首音效,迴圈兩次playSound(2,2);} }); stopTwo.setOnClickListener(new Button.OnClickListener() {@Overridepublic 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為正常速度 }}