2011-12-01

在 Android 裡播放音效(SoundPool)

大致與 前一個練習 相似,音效檔一般都是用 SoundPool 來播放。

main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/tarzan"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="泰山"
        android:onClick="onClick" />

    <Button
        android:id="@+id/sneeze"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="哈啾"
        android:onClick="onClick" />
    
</LinearLayout>
SoundPoolActivity
public class SoundPoolActivity extends Activity {

    private static final int SOUND_COUNT = 2;
    private int sneezeId;
    private int tarzanId;
    private SoundPool soundPool;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 建立 SoundPool
        // 第一個參數:SoundPool 不像 MediaPlayer 一個實體管理一個音樂檔案,SoundPool 可以一個實體管理多個檔案
        // 第二個參數:串流類型
        // 第三個參數:取樣品質,預設用 0
        this.soundPool = new SoundPool(SOUND_COUNT, AudioManager.STREAM_MUSIC,
                0);

        // 載入音樂
        // 不像前一個練習直接讀取 SD 卡的檔案,這邊是讀取 resource
        this.sneezeId = this.soundPool.load(this, R.raw.sneeze, 1);
        this.tarzanId = this.soundPool.load(this, R.raw.tarzan, 1);
    }

    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.sneeze:
            // 第二、三參數分別為左右喇叭的音量,可用 0 到 1
            // 第四參數固定用 0
            // 第五個參數為播放次數,0 為不重複,-1 為無限重複
            // 第六個參數為播放速度,可用 0.5 到 2
            this.soundPool.play(this.sneezeId, 1, 1, 0, 0, 1);
            break;
        case R.id.tarzan:
            this.soundPool.play(this.tarzanId, 1, 1, 0, 0, 1);
            break;
        }
    }
}

也可以呼叫 pause() 或 stop() 來控制播放。

和 MediaPlayer 一樣,SoundPool 不用以後要在 onPause() 或者 onDestroy() 裡呼叫 release() 釋放資源。


相關文章

沒有留言:

張貼留言