1. 程式人生 > >點選按鈕播放聲音

點選按鈕播放聲音

我們都知道,進行音訊播放的時候大多都會採用mediaplaer,但是他的生成和銷燬會佔用很大的資源。

例如在五子棋遊戲中,如果每次都採用將會給系統帶來太多資源的浪費。這時候我們就應該採用soundpool

Android提供了另外一種,叫做SoundPool,它適合播放那些需要反覆播放,但時間較短的音效。它支援同時播放多種聲音,這些聲音在系統開始時會載入到列表中,按照這些聲音的id,我們可以呼叫這些音效。

下面我們進入一個例項看看SoundPool到底是怎麼工作的。

例如,現在在一個五子棋遊戲中,我們需要在棋子落盤的時候播放一段聲音。我們可以利用SoundPool,因為它時間很短,而且需要反覆播放,並且我們不希望聲音佔用太大資源。

先看看程式碼:

private SoundPool soundPool;

soundPoolnewSoundPool(10,AudioManager.STREAM_SYSTEM,5);

soundPool.load(this,R.raw.collide,1);

soundPool.play(1,1, 1, 0, 0, 1);

程式碼非常簡單,第一行是聲明瞭一個SoundPool物件,這個一般是作為類的成員屬性出現的。第二行將soundPool例項化,第一個引數為soundPool可以支援的聲音數量,這決定了Android為其開設多大的緩衝區,第二個引數為聲音型別,在這裡標識為系統聲音,除此之外還有AudioManager.STREAM_RING以及AudioManager.STREAM_MUSIC等,系統會根據不同的聲音為其標誌不同的優先順序和緩衝區,最後引數為聲音品質,品質越高,聲音效果越好,但耗費更多的系統資源。

第三行,系統為soundPool載入聲音,第一個引數為上下文引數,第二個引數為聲音的id,一般我們將聲音資訊儲存在res的raw資料夾下,如下圖所示。


第三個引數為聲音的優先順序,當多個聲音衝突而無法同時播放時,系統會優先播放優先順序高的。

第四行就是播放了,第一個引數為id,id即為放入到soundPool中的順序,比如現在collide.wav是第一個,因此它的id就是1。第二個和第三個引數為左右聲道的音量控制。第四個引數為優先順序,由於只有這一個聲音,因此優先順序在這裡並不重要。第五個引數為是否迴圈播放,0為不迴圈,-1為迴圈。最後一個引數為播放比率,從0.5到2,一般為1,表示正常播放