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