android如何短時間音效播放實現SoundPool

來源:互聯網
上載者:User

  實現技術: android.media.SoundPool實現 (管理和播放應用程式的聲音資源,直接載入到記憶體)。

  一.基礎知識:

  1. 建立一個SoundPool :

  我們先看看SoundPool函數的定義,如下:

  [java]

  public SoundPool(

  int maxStream, // 同時播放的流的最大數量

  int streamType,// 流的類型,一般為STREAM_MUSIC

  int srcQuality // 採樣率轉化品質,當前無效果,使用0作為預設值

  )

  public SoundPool(

  int maxStream, // 同時播放的流的最大數量

  int streamType,// 流的類型,一般為STREAM_MUSIC

  int srcQuality // 採樣率轉化品質,當前無效果,使用0作為預設值

  ) eg.

  SoundPool soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);

  建立了一個最多支援3個流同時播放的,類型標記為音樂的SoundPool。

  2. 載入一個音頻檔案:

  以下方法,取其一即可:

  [java]

  int load(Context context, int resId, int priority) //從APK資源載入

  int load(FileDescriptor fd, long offset, long length, int priority) //從FileDescriptor對象載入

  int load(AssetFileDescriptor afd, int priority) //從Asset對象載入

  int load(String path, int priority) //從完整檔案路徑名載入

  int load(Context context, int resId, int priority) //從APK資源載入

  int load(FileDescriptor fd, long offset, long length, int priority) //從FileDescriptor對象載入

  int load(AssetFileDescriptor afd, int priority) //從Asset對象載入

  int load(String path, int priority) //從完整檔案路徑名載入 我目前使用的是第一種,從APK資源載入:

  [java]

  int load(

  Context context, // 應用程式的上下文,即當前的Activity,可理解為誰來調用這個方法。

  int resId, // 資源的ID

  int priority // 優先順序,我們設定為1即可。

  )

  int load(

  Context context, // 應用程式的上下文,即當前的Activity,可理解為誰來調用這個方法。

  int resId, // 資源的ID

  int priority // 優先順序,我們設定為1即可。

  )

  3. 播放音效:

  [java]

  int play(

  int soundID, // 播放的音樂ID

  float leftVolume, // 左聲道音量

  float rightVolume, // 右聲道音量

  int priority, // 優先順序,0為最低

  int loop, // 迴圈次數,0為不迴圈,-1為永遠迴圈

  float rate // 回放速度,該值在0.5-2.0之間,1為正常速度。

  )

  int play(

  int soundID, // 播放的音樂ID

  float leftVolume, // 左聲道音量

  float rightVolume, // 右聲道音量

  int priority, // 優先順序,0為最低

  int loop, // 迴圈次數,0為不迴圈,-1為永遠迴圈

  float rate // 回放速度,該值在0.5-2.0之間,1為正常速度。

  )

  4. 暫停音效:

  [java]

  void pause(int streamID) // 參數為 音效的ID。

  void pause(int streamID) // 參數為 音效的ID。

  二.編程實現:

  1. 介面編輯(reslayoutmain.xml):

  [java]

  

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  >

  

  android:text="播放音效1"

  android:id="@+id/Button01"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  android:text="播放音效2"

  android:id="@+id/Button02"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  android:text="暫停音效1"

  android:id="@+id/Button1Pause"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  android:text="暫停音效2"

  android:id="@+id/Button2Pause"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  >

  

  android:text="播放音效1"

  android:id="@+id/Button01"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  android:text="播放音效2"

  android:id="@+id/Button02"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  android:text="暫停音效1"

  android:id="@+id/Button1Pause"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  android:text="暫停音效2"

  android:id="@+id/Button2Pause"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  LinearLayout 定義了一個 vertical(垂直方向) 上的線性布局。

  在這個布局之內,填充四個按鈕控制項,其text, id, layout_width, 和layout_height 參數在裡面有填充說明。

  介面布局效果如下:

  2. 代碼編輯(srcwyfzclMyActivity.java):

  [java]

  package wyf.zcl;

  import java.util.HashMap; // 引入相關包

  import android.app.Activity;

  import android.media.AudioManager;

  import android.media.SoundPool;

  import android.os.Bundle;

  import android.view.View;

  import android.widget.Button;

  import android.widget.Toast;

  public class MyActivity extends Activity {

  /** Called when the activity is first created. */

  SoundPool sp; //得到一個聲音池引用

  HashMap spMap; //得到一個map的引用

  Button b1; //聲音播放控制按鈕

  Button b1Pause; //聲音暫停控制按鈕

  Button b2; //聲音播放控制按鈕

  Button b2Pause; //聲音暫停控制按鈕

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  initSoundPool(); //初始化聲音池

  b1=(Button)findViewById(R.id.Button01); //聲音播放控制按鈕執行個體化

  b2=(Button)findViewById(R.id.Button02); //聲音播放控制按鈕執行個體化

  b1Pause=(Button)findViewById(R.id.Button1Pause);

  b2Pause=(Button)findViewById(R.id.Button2Pause);

  b1.setOnClickListener(new View.OnClickListener() {

  @Override

  public void onClick(View v) {

  playSound(1,1); //播放第一首音效,迴圈一遍

  Toast.makeText(MyActivity.this, "播放音效1", Toast.LENGTH_SHORT).show();

  }});

  b1Pause.setOnClickListener(new View.OnClickListener() {

  @Override

  public void onClick(View v) {

  sp.pause(spMap.get(1));

  Toast.makeText(MyActivity.this, "暫停音效1", Toast.LENGTH_SHORT).show();

  }});

  b2.setOnClickListener(new View.OnClickListener() {

  @Override

  public void onClick(View v) {

  playSound(2,1); //播放第二首音效,迴圈一遍

  Toast.makeText(MyActivity.this, "播放音效2", Toast.LENGTH_SHORT).show();

  }});

  b2Pause.setOnClickListener(new View.OnClickListener() {

  @Override

  public void onClick(View v) {

  sp.pause(spMap.get(2));

  Toast.makeText(MyActivity.this, "暫停音效2", Toast.LENGTH_SHORT).show();

  }});

  }

  public void initSoundPool(){ //初始化聲音池

  sp=new SoundPool(

  5, //maxStreams參數,該參數為設定同時能夠播放多少音效

  AudioManager.STREAM_MUSIC, //streamType參數,該參數設定音訊類型,在遊戲中通常設定為:STREAM_MUSIC

  0 //srcQuality參數,該參數設定音頻檔案的品質,目前還沒有效果,設定為0為預設值。

  );

  spMap=new HashMap();

  spMap.put(1, sp.load(this, R.raw.attack02, 1));

  spMap.put(2, sp.load(this, R.raw.attack14, 1));

  }

  public void playSound(int sound,int number){ //播放聲音,參數sound是播放音效的id,參數number是播放音效的次數

  AudioManager am=(AudioManager)this.getSystemService(this.AUDIO_SERVICE);//執行個體化AudioManager對象

  float audioMaxVolumn=am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); //返回當前AudioManager對象的最大音量值

  float audioCurrentVolumn=am.getStreamVolume(AudioManager.STREAM_MUSIC);//返回當前AudioManager對象的音量值

  float volumnRatio=audioCurrentVolumn/audioMaxVolumn;

  sp.play(

  spMap.get(sound), //播放的音樂id

  volumnRatio, //左聲道音量

  volumnRatio, //右聲道音量

  1, //優先順序,0為最低

  number, //迴圈次數,0無不迴圈,-1無永遠迴圈

  1 //回放速度 ,該值在0.5-2.0之間,1為正常速度

  );

  }

  }

  package wyf.zcl;

  import java.util.HashMap; // 引入相關包

  import android.app.Activity;

  import android.media.AudioManager;

  import android.media.SoundPool;

  import android.os.Bundle;

  import android.view.View;

  import android.widget.Button;

  import android.widget.Toast;

  public class MyActivity extends Activity {

  /** Called when the activity is first created. */

  SoundPool sp; //得到一個聲音池引用

  HashMap spMap; //得到一個map的引用

  Button b1; //聲音播放控制按鈕

  Button b1Pause; //聲音暫停控制按鈕

  Button b2; //聲音播放控制按鈕

  Button b2Pause; //聲音暫停控制按鈕

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  initSoundPool(); //初始化聲音池

  b1=(Button)findViewById(R.id.Button01); //聲音播放控制按鈕執行個體化

  b2=(Button)findViewById(R.id.Button02); //聲音播放控制按鈕執行個體化

  b1Pause=(Button)findViewById(R.id.Button1Pause);

  b2Pause=(Button)findViewById(R.id.Button2Pause);

  b1.setOnClickListener(new View.OnClickListener() {

  @Override

  public void onClick(View v) {

  playSound(1,1); //播放第一首音效,迴圈一遍

  Toast.makeText(MyActivity.this, "播放音效1", Toast.LENGTH_SHORT).show();

  }});

  b1Pause.setOnClickListener(new View.OnClickListener() {

  @Override

  public void onClick(View v) {

  sp.pause(spMap.get(1));

  Toast.makeText(MyActivity.this, "暫停音效1", Toast.LENGTH_SHORT).show();

  }});

  b2.setOnClickListener(new View.OnClickListener() {

  @Override

  public void onClick(View v) {

  playSound(2,1); //播放第二首音效,迴圈一遍

  Toast.makeText(MyActivity.this, "播放音效2", Toast.LENGTH_SHORT).show();

  }});

  b2Pause.setOnClickListener(new View.OnClickListener() {

  @Override

  public void onClick(View v) {

  sp.pause(spMap.get(2));

  Toast.makeText(MyActivity.this, "暫停音效2", Toast.LENGTH_SHORT).show();

  }});

  }

  public void initSoundPool(){ //初始化聲音池

  sp=new SoundPool(

  5, //maxStreams參數,該參數為設定同時能夠播放多少音效

  AudioManager.STREAM_MUSIC, //streamType參數,該參數設定音訊類型,在遊戲中通常設定為:STREAM_MUSIC

  0 //srcQuality參數,該參數設定音頻檔案的品質,目前還沒有效果,設定為0為預設值。

  );

  spMap=new HashMap();

  spMap.put(1, sp.load(this, R.raw.attack02, 1));

  spMap.put(2, sp.load(this, R.raw.attack14, 1));

  }

  public void playSound(int sound,int number){ //播放聲音,參數sound是播放音效的id,參數number是播放音效的次數

  AudioManager am=(AudioManager)this.getSystemService(this.AUDIO_SERVICE);//執行個體化AudioManager對象

  float audioMaxVolumn=am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); //返回當前AudioManager對象的最大音量值

  float audioCurrentVolumn=am.getStreamVolume(AudioManager.STREAM_MUSIC);//返回當前AudioManager對象的音量值

  float volumnRatio=audioCurrentVolumn/audioMaxVolumn;

  sp.play(

  spMap.get(sound), //播放的音樂id

  volumnRatio, //左聲道音量

  volumnRatio, //右聲道音量

  1, //優先順序,0為最低

  number, //迴圈次數,0無不迴圈,-1無永遠迴圈

  1 //回放速度 ,該值在0.5-2.0之間,1為正常速度

  );

  }

  }

  前排幾個import用來匯入程式依賴的相關包;

  然後是Activity類,相當於註冊我們介面的回呼函數,@Override了Activity的 onCreate()函數,當建立MyActivity(即我們的視窗時)調用該方法。

  initSoundPool()函數 初始化音效池;

  findViewById 將按鈕控制項執行個體化;

  @Override 按鈕的按鍵監聽函數 setOnKeyListener()。

  ============================================================================================

  Eclipse顯示行號: 【Ctrl+F10】-->>【Show Line Numbers】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.