SoundPool爲即時音效,一般用於遊戲裏面的短暫的音效,與Android系統自帶的MediaPlay而言不會佔用大量的系統資源,並且播放是不需要緩衝,延遲較小,一般的文件大小爲<=7秒的小音頻文件。
SoundPool類的構造器和方法如下圖:
本demo的運行結果如下圖:
源碼連接:
xml文件非常的簡單 就兩個button 的擺放所以 你們自己寫,非常的簡單
下面給出主要的.java文件的代碼:
package com.xyliwp.soundpooldeom;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.util.HashMap;
/*
需求:本dome主要爲了熟悉解釋 soundpool
soundpool 主要用於 小於等於7秒的即時音樂的播放
即爲既時音樂。的簡介,它相比較Android提供的MediaPlay而言 播放時並需要緩存 並且不會
佔用大量的系統資源。
*/
public class MainActivity extends AppCompatActivity {
/**
* 生命soundpool的引用
*/
private SoundPool soundPool;
//聲明hashmap用來存放聲音文件
private HashMap<Integer,Integer> hashMap;
//當前正在播放的streamid
private int currStreamId;
//對播放和暫停兩個按鈕的定義
private Button button_bofang;
private Button button_zanting;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化 soundpool
initSoundPool();
//控件id的綁定
initId();
//控件點擊事件的設置
idOnClick();
}
/**
* id綁定
*/
private void initId(){
button_bofang = (Button)findViewById(R.id.bofang);
button_zanting = (Button)findViewById(R.id.zanting);
}
/**
* 點擊事件的設置
*/
private void idOnClick() {
button_zanting.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//停止當前音效的播放
soundPool.stop(currStreamId);
Toast.makeText(getApplicationContext(),"暫停即時音效",Toast.LENGTH_SHORT).show();
}
});
button_bofang.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//播放1號資源 並且播放一次
playSound(1,0);
Toast.makeText(getApplicationContext(),"播放即時音效",Toast.LENGTH_SHORT).show();
}
});
}
/**
* 初始化 聲音池
*/
private void initSoundPool(){
//創建soundpool對象
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC,0);
hashMap = new HashMap<Integer, Integer>();
//加載 zhandou音效 並這隻爲1號
hashMap.put(1,soundPool.load(this,R.raw.qiangsheng,1));
}
/**
* 播放即時音效
* @param sound
* @param loop
*/
private void playSound(int sound,int loop){
//AudioManager引用
AudioManager audioManager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
//獲取當前系統音量
float qian = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
//獲取系統最大音量
float max = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//計算得到播放音量
float bofang = qian/max;
/**
* 設置播放文件的音量
* hashMap.get(sound) 播放的id
* bofang,bofang 左右升到的音量
* loop 循環次數,0不循環,-1永遠循環
* 1 參數的優先級 0爲最低
* 1.0f 回放的速度
*/
currStreamId = soundPool.play(hashMap.get(sound),bofang,bofang,1,loop,1.0f);
}
}