即時音效,顧名思義,是一個又短又快的音效,適合於播放時間較短反應迅速的音頻文件,例如輸入法打字時的“噠噠”聲就是這個東西,下象棋時的下棋聲也是…
該技術繼承自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) {
//暫停第一首音效www.aiwalls.com
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為正常速度
}
}
作者 婁立軍