以前只知道Android中能夠用MediapLayer播放音樂,原來今天才發現能夠用SoundPool,用SoundPool能夠播一些短的反應速度要求高的聲音,好比遊戲中的爆破聲,而MediapLayer適合播放長點的。 android
通常在玩遊戲的時候,特別是在射擊遊戲中,常常會出現「突突突的射擊」的聲音,聽起來好多聲音連發的效果。其實實現起來是不難的,都知道,在Java中有線程池的概念,那麼,相似的,在Android中,也存在SoundPool的概念。ide
備註:聲音池默認申請1M的內存空間,因此不適合加載大文件。工具
SoundPool載入音樂文件使用了獨立的線程,不會阻塞UI主線程的操做。可是這裏若是音效文件過大沒有載入完成,咱們調用play方法時可能產生嚴重的後果,這裏Android SDK提供了一個SoundPool.OnLoadCompleteListener類來幫助咱們瞭解媒體文件是否載入完成,咱們重載 onLoadComplete(SoundPool soundPool, int sampleId, int status) 方法便可得到。 this
從上面的onLoadComplete方法能夠看出該類有不少參數,好比相似id,是的SoundPool在load時能夠處理多個媒體一次初始化並放入內存中,這裏效率比MediaPlayer高了不少。 spa
SoundPool類支持同時播放多個音效,這對於遊戲來講是十分必要的,而MediaPlayer類是同步執行的只能一個文件一個文件的播放。線程
SoundPool播放工具類代碼以下 :code
package com.sendinfo.cloudcheck.mediaplay; import android.content.Context; import android.media.AudioManager; import android.media.SoundPool; import android.media.SoundPool.OnLoadCompleteListener; public class SoundPoolUtil { private static SoundPool mSoundPool; public static SoundPool create(Context context, int resId) { /** * 初始化聲音池 * 參數1:在聲音池中最大的數量 * 參數2:流類型 默認使用AudioManager.STREAM_MUSIC * 參數3:質量 默認爲0 這個值暫時沒影響 */ if (mSoundPool == null) { mSoundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0); } /** * load加載聲音 * 參數1:上下文 * 參數2:音頻文件 * 參數3:優先級 默認1 暫時沒影響 */ final int soundId = mSoundPool.load(context, resId, 1); mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { @Override public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { /** * 參數1:加載返回的聲音Id * 參數2:左聲道 * 參數3:右聲道 * 參數4:優先級 * 參數5:是否循環播放 0:不循環 -1:循環 * 參數6:速率 0.5--2.0 */ soundPool.play(soundId, 1.0f, 0.5f, 1, 0, 1.0f); } }); return mSoundPool; } /** * @Title: dismisSoundPool @Description: 釋放播放池 @param 設定文件 @return void * 返回類型 @throws */ public static void dismisSoundPool() { if (mSoundPool != null) { mSoundPool.release(); mSoundPool = null; } } } 音頻文件放在res/raw目錄下面 test.wav 如何調用 : SoundPoolUtil.create(MainActivity.this, R.raw.test);