萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 安卓開發 >> android如何短時間音效播放實現SoundPool

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

  實現技術: 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() {

  @Ove

copyright © 萬盛學電腦網 all rights reserved