Android應(yīng)用:SoundPool 播放音效
1.SoundPool 簡(jiǎn)介
開發(fā)Android軟件中我們可能經(jīng)常需播放多媒體聲音文件,一般使用MediaPlayer類
但該類占用資源較多,對(duì)于游戲等應(yīng)用可能不是很適合,SoundPool類在SDK
的android.media.SoundPool,顧名思義是聲音池的意思。主要播放一些較短的聲音
片段,可以從程序的資源或文件系統(tǒng)加載,相對(duì)于MediaPlayer類可以做到使用較少
的CPU資源和較短的反應(yīng)延遲。
?????SoundPool和其他聲音播放類相比,其特點(diǎn)是可以自行設(shè)置聲音的
品質(zhì)、音量、播放比率等參等。并且它可以同時(shí)管理多個(gè)音頻流,每個(gè)
流都有獨(dú)自的ID,對(duì)某個(gè)音頻流的管理都是通過ID進(jìn)行的。
2 使用方法
SoundPool基本使用方法:
??????????????1. 創(chuàng)建一個(gè)SoundPool?
? ?? ?? ?? ?? ???創(chuàng)建一個(gè)SoundPool對(duì)象:new SoundPool(int maxStreams, int streamType, int srcQuality);
?????????????? public SoundPool(int maxStream, int streamType, int srcQuality)?
?????????????? maxStream —— 同時(shí)播放的流的最大數(shù)量?
????????????????? streamType —— 流的類型,一般為STREAM_MUSIC(具體在AudioManager類中列出)?
?????????? ? ?? ? srcQuality —— 采樣率轉(zhuǎn)化質(zhì)量,當(dāng)前無效果,使用0作為默認(rèn)值?
?????????? ? ? ?? eg.?
?????????? ? ? ?? SoundPool soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
??????????????? ? ? ?? 創(chuàng)建了一個(gè)最多支持3個(gè)流同時(shí)播放的,類型標(biāo)記為音樂的SoundPool。
? ?? ???2、 從資源或者文件載入音頻流: load(Context context, int resId, int priority);
??????????????????? soundpool的加載:?
??? ? ? ? ? ? ? ? ? ?? int? load(Context context, int resId, int priority)? //從APK資源載入?
? ? ? ? ? ? ? ? ? ? ?? int? load(FileDescriptor fd, long offset, long length, int priority)? //從FileDescriptor對(duì)象載入?
? ? ? ? ? ? ? ? ? ? ?? int? load(AssetFileDescriptor afd, int priority)? //從Asset對(duì)象載入?
?????????????????????? int? load(String path, int priority)? //從完整文件路徑名載入?
????????????????????????????????? 最后一個(gè)參數(shù)為優(yōu)先級(jí)。
???????????? ? ? ? ? ? ? 一般把多個(gè)聲音放到HashMap中去,比如?
?????????????????????? ? soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);?
??????????????????? ? ?? soundPoolMap = new HashMap
????????? ? ? ? ?? ? play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) ,
??? ? ? ? ? ? ? ? ? ?? 其中l(wèi)eftVolume和rightVolume表示左右音量,
??????????????????????????? priority表示優(yōu)先級(jí),
??????????????????????????? loop表示循環(huán)次數(shù),
?????????????????????????? rate表示速率,如? //速率最低0.5最高為2,1代表正常速度?
??????????????????? sp.play(soundId, 1, 1, 0, 0, 1);?
? ? ? ? ? ? ? ? ? ? 而停止則可以使用 pause(int streamID) 方法,這里的streamID和soundID均在構(gòu)造SoundPool類的
??????????????????? 第一個(gè)參數(shù)中指明了總數(shù)量,而id從0開始。
3. soundpool一個(gè)小應(yīng)用 布局 xml 代碼:
java 代碼:
package?com.example.android_sample_3_1; import?java.util.HashMap; import?android.media.AudioManager; import?android.media.SoundPool; import?android.os.Bundle; import?android.provider.MediaStore.Audio; import?android.app.Activity; import?android.view.Menu; import?android.view.View; import?android.widget.Button; import?android.widget.Toast; public?class?MainActivity?extends?Activity?{ SoundPool?sp; HashMapspMap; Button?b1; Button?b1Pause; Button?b2; Button?b2Pause; @Override protected?void?onCreate(Bundle?savedInstanceState)?{ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initSoundPool(); b1?=?(Button)?findViewById(R.id.button1); b1Pause?=?(Button)?findViewById(R.id.button3); b2?=?(Button)?findViewById(R.id.button2); b2Pause?=?(Button)?findViewById(R.id.button4); b1.setOnClickListener(new?View.OnClickListener()?{ @Override public?void?onClick(View?v)?{ palySound(1,?1); Toast.makeText(MainActivity.this,?"播放音效1",?Toast.LENGTH_SHORT).show(); } }); b1Pause.setOnClickListener(new?View.OnClickListener()?{ @Override public?void?onClick(View?v)?{ sp.pause(spMap.get(1)); Toast.makeText(MainActivity.this,?"暫停音效1",?Toast.LENGTH_SHORT).show(); } }); b2.setOnClickListener(new?View.OnClickListener()?{ @Override public?void?onClick(View?v)?{ palySound(2,?1); Toast.makeText(MainActivity.this,?"播放音效2",?Toast.LENGTH_SHORT).show(); } }); b2Pause.setOnClickListener(new?View.OnClickListener()?{ @Override public?void?onClick(View?v)?{ sp.pause(spMap.get(2)); Toast.makeText(MainActivity.this,?"暫停音效2",?Toast.LENGTH_SHORT).show(); } }); } private?void?palySound(int?sound,?int?number)?{ AudioManager?am?=?(AudioManager)?this.getSystemService(this.AUDIO_SERVICE); float?audioMaxVolumn?=?am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); float?audioCurrentVolumn?=?am.getStreamVolume(AudioManager.STREAM_MUSIC); float?volumnRatio?=?audioCurrentVolumn?/?audioMaxVolumn; sp.play(spMap.get(sound),?volumnRatio,?volumnRatio,?1,?number,?1); } private?void?initSoundPool()?{ sp?=?new?SoundPool(5,?AudioManager.STREAM_MUSIC,?0); spMap?=?new?HashMap(); spMap.put(1,?sp.load(this,?R.raw.attack02,?1)); spMap.put(2,?sp.load(this,?R.raw.attack14,?1)); } @Override public?boolean?onCreateOptionsMenu(Menu?menu)?{ //?Inflate?the?menu;?this?adds?items?to?the?action?bar?if?it?is?present. getMenuInflater().inflate(R.menu.main,?menu); return?true; } }