MediaPlayer與即時音效
在android游戲開發中,有一些需要一點就播放音樂的需求,比如在飛車中的加速聲音、下旗的滴滴聲等,這些很短快速的就需要使用Android的即時音效。如果用MediaPlayer會占用大量的系統資源,而且播放的時候還需要緩沖,有較大的時延,因此即時音效就能補充它的不足。
即時音效的主要類
public SoundPool (int maxStreams, int streamType, int srcQuality)
Since:
API Level 1
創建SoundPool對象
Parameters
maxStreams | 設置最多同時播放的音效個數 |
---|---|
streamType | 設置音頻的類型,一般設置為 STREAM_MUSIC . |
srcQuality | 默認為0,現在還什么作用 |
Returns
- 返回一個SoundPool對象,如果創建失敗返回null
public int load (Context context, int resId, int priority)
Since:
API Level 1
重APK resource中加載音效文件. 例如,如果你想加載一個raw文件下的explosion.mp3,你在代碼中調用R.raw.explosion這個資源ID. 注意這個文件中不能有兩個同名的文件,如
explosion.wav和explosion.mp3。這樣可能會加載錯誤。沒測試過。
Parameters
context | 上下文 |
---|---|
resId | 要加載的音效文件ID |
priority | 優先級,設為1即可 |
Returns
返回資源ID,這個值可以加用來播放與停止音效文件。
public final void pause (int streamID)
Since:
API Level 1
暫停播放的音效
Parameters
streamID | 上一個函數返回的ID號 |
---|
public final void stop (int streamID)
Since:
API Level 1
停止播放的聲音
Parameters
streamID | 用Play返回的當前ID |
---|
一個案例:
package com.example.soundpool; import java.util.HashMap; import android.app.Activity; import android.content.Context; import android.media.AudioManager; import android.media.SoundPool; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { private Button play; private Button stop; private SoundPool sp; private float volume; private int currentID; private HashMap<Integer, Integer> hm; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); play=(Button)findViewById(R.id.play); stop=(Button)findViewById(R.id.stop); initSoundPool(); play.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { playSound(1,0); Toast.makeText(getApplicationContext(), "播放即時音效!", Toast.LENGTH_SHORT).show(); } }); stop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { sp.stop(currentID); Toast.makeText(getApplicationContext(), "停止即時音效!", Toast.LENGTH_SHORT).show(); } }); } private void initSoundPool() { sp=new SoundPool(2, AudioManager.STREAM_MUSIC, 0); hm =new HashMap<Integer, Integer>(); hm.put(1, sp.load(getApplicationContext(), R.raw.musictest, 1)); } private void playSound(int num,int loop){ AudioManager am=(AudioManager) this.getSystemService(Context.AUDIO_SERVICE); float currentSound=am.getStreamVolume(AudioManager.STREAM_MUSIC); float maxSound=am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); volume=currentSound/maxSound; currentID=sp.play(hm.get(num), volume, volume, 1, loop, 1.0f); } }
運行結果: