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