一.SoundPool类
1.SoundPool类用于管理和播放应用程序的声音资源,该类将声音文件加载到内存中,一般将时间小于7秒左右的声音文件用于该技术播放。
2.通过构造方法public SoundPool (int maxStreams,int streamType,int srcQuality)得到SoundPool类的对象。下面介绍其构造方法中的各参数的作用。
1>maxStreams:该参数用于设置同时能够播放多少音效。例如设置为4,则最多同时可播放4首音效。
2>streamType:该参数设置音频类型,在游戏中通常设置为:STREAM_MUSIC。
3>srcQuality:该参数设置音频文件的质量,目前还没有效果,设置为0(默认值)。
二.使用SoundPool类的常用方法,编写一个即时音效的例子。
(1)项目名为Sample
(2)在res目录下新建一个名为raw的文件夹,存放项目中用到的声音文件。
1.编写layout/main.xml文件,设置控件的布局
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- 添加4个Button控件 -->
<Button
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="播放音效1" />
<Button
android:id="@+id/button2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="播放音效2" />
<Button
android:id="@+id/button1Pause"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="暂停音效1" />
<Button
android:id="@+id/button2Pause"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="暂停音效2" />
</LinearLayout>
</span>
2.在src目录下的com.example.sample包中,编写MainActivity.java类
<span style="font-size:18px;">package com.example.sample;
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 MainActivity extends Activity {
SoundPool sp;
HashMap<Integer, Integer> spMap;
Button b1;
Button b1Pause;
Button b2;
Button b2Pause;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initSoundPool(); // 初始化声音池
b1 = (Button) findViewById(R.id.button1); // 声音播放控制按钮实例化
b2 = (Button) findViewById(R.id.button2);
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(MainActivity.this, "播放音效1", Toast.LENGTH_SHORT)
.show();
}
});
b1Pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sp.pause(spMap.get(1));
Toast.makeText(MainActivity.this, "暂停音效1", Toast.LENGTH_SHORT);
}
});
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playSound(2, 1); // 播放第二首音效,循环一遍
Toast.makeText(MainActivity.this, "播放音效2", Toast.LENGTH_SHORT)
.show();
}
});
b2Pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sp.pause(spMap.get(2));
Toast.makeText(MainActivity.this, "暂停音效2", Toast.LENGTH_SHORT);
}
});
}
private void initSoundPool() { // 初始化声音池
// 第一个参数设置同时能够播放多少音效,第二个参数设置音频类型,第三个参数设置音频文件的质量,目前还没效果,设置为0(默认值)
sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
spMap = new HashMap<Integer, Integer>();
spMap.put(1, sp.load(this, R.raw.music1, 1));
spMap.put(2, sp.load(this, R.raw.music2, 1));
}
public void playSound(int sound, int number) {
AudioManager am = (AudioManager) this
.getSystemService(this.AUDIO_SERVICE);
float audioMaxVolumn = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float audioCurrentVolumn = am
.getStreamVolume(AudioManager.STREAM_MUSIC);
float volumnRatio = audioCurrentVolumn / audioMaxVolumn;
sp.play(spMap.get(sound), volumnRatio, volumnRatio, 1, number, 1);
}
}
</span>
说明:
1.在res/raw文件下,添加music1、music2两个声音文件。
2.第23行,是为Activity的onCreate()方法。当创建MainActivity时调用该方法。
3.第33~69行,为播放音效1,播放音效2,暂停播放音效1,暂停播放音效2的初始化及监听方法。
4.第73~79行,初始化声音池,SoundPool调用load方法可加载音频文件,然后将加载了音频文件的SoundPool添加到一个HashMap中,提供给以后使用。
5.第81~89行,为播放音效,调用SoundPool中的play方法,播放声音,参数sound是播放音效的ID,参数number是播放音效的次数。
显示效果: