Android SoundPool 的簡單使用

以前只知道Android中能夠用MediapLayer播放音樂,原來今天才發現能夠用SoundPool,用SoundPool能夠播一些短的反應速度要求高的聲音,好比遊戲中的爆破聲,而MediapLayer適合播放長點的。 android

通常在玩遊戲的時候,特別是在射擊遊戲中,常常會出現「突突突的射擊」的聲音,聽起來好多聲音連發的效果。其實實現起來是不難的,都知道,在Java中有線程池的概念,那麼,相似的,在Android中,也存在SoundPool的概念。ide

備註:聲音池默認申請1M的內存空間,因此不適合加載大文件。工具

  1. SoundPool載入音樂文件使用了獨立的線程,不會阻塞UI主線程的操做。可是這裏若是音效文件過大沒有載入完成,咱們調用play方法時可能產生嚴重的後果,這裏Android SDK提供了一個SoundPool.OnLoadCompleteListener類來幫助咱們瞭解媒體文件是否載入完成,咱們重載 onLoadComplete(SoundPool soundPool, int sampleId, int status) 方法便可得到。 this

  2. 從上面的onLoadComplete方法能夠看出該類有不少參數,好比相似id,是的SoundPool在load時能夠處理多個媒體一次初始化並放入內存中,這裏效率比MediaPlayer高了不少。 spa

  3. 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);
相關文章
相關標籤/搜索