Android游戏开发教程----游戏中的声音
SDK为我们提供了SoundPool 用于播放游戏音效,还提供了MediaPlayer为我们提供游戏音乐的播放。SoundPool(android.media.SoundPool),顾名思义是声音池的意思,主要用于播放一些较短的声音片段,支持从程序的资源或文件加载。
SoundPool技术
&&&& 在游戏开发中我们经常需要播放一些游戏音效(比如:子弹爆炸,物体撞击等),这些音效的共同特点是短促、密集、延迟程度小。在这样的场景下我们可以使用SoundPool。
SoundPool特性:
&1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能使用一些很短的声音片段,而不是用它来播放歌曲或者游戏背景音乐。
&2. SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用。
&3. 音频格式建议使用OGG格式。
SoundPool使用方法:
1. 创建一个SoundPool
public SoundPool(int maxStream, int streamType, int srcQuality)
maxStream && 同时播放的流的最大数量
streamType && 流的类型,一般为STREAM_MUSIC(具体在AudioManager类中列出)
srcQuality && 采样率转化质量,当前无效果,使用0作为默认值
SoundPool soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
&&& 创建了一个最多支持3个流同时播放的,类型标记为音乐的SoundPool。&
2 soundpool的加载:
& 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)& //从完整文件路径名载入
最后一个参数为优先级。
play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) ,
其中leftVolume和rightVolume表示左右音量 取值范围(range = 0.0 to 1.0)
priority表示优先级
loop表示循环次数
rate表示速率,如
//速率最低0.5最高为2,1代表正常速度
sp.play(soundId, 1, 1, 0, 0, 1);
关于音频流:
&&& 在Android系统中有多种音频流,通过Activity中的函数 setVolumeControlStream(int streamType)可以设置该Activity中音量控制键控制的音频流,一般在onCreate函数中设置。
Android中有如下几种音频流(streamType是需要调整音量的类型):
AudioManager.STREAM_MUSIC& /音乐回放即媒体音量/
AudioManager.STREAM_RING /铃声/
AudioManager.STREAM_ALARM& /警报/
AudioManager.STREAM_NOTIFICATION /窗口顶部状态栏通知声/
AudioManager.STREAM_SYSTEM& /系统/
AudioManager.STREAM_VOICECALL /通话 /
AudioManager.STREAM_DTMF /双音多频/
仔细分析了SoundPool 的API后,毫无疑问我们应该让事情简单些。
编写AndroidSoundPool类简化SoundPool的使用
[java] package com.gaofeng.&
import java.io.IOE&
import java.util.*;&
import android.app.A&
import android.content.res.AssetFileD&
import android.content.res.AssetM&
import android.media.AudioM&
import android.media.SoundP&
public class AndroidSoundPool {&
& AssetM&
&&& SoundPool soundP&
&& HashMap&String,Integer& soundMap=new HashMap&String,Integer&();&
& public AndroidSoundPool(Activity activity) {&
&&&&& activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);&
&&&&&&& this.assets = activity.getAssets();&
&&&&&&& this.soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);&
/** 从asset中加载声音文件
& * @param filename 声音文件名
& * @param identifer 声音标识名,在播放声音时调用
& */&
& public void load(String filename,String identifer) {&
&&&&&&& try {&
&&&&&&&&&&& AssetFileDescriptor assetDescriptor = assets.openFd(filename);&
&&&&&&&&&&& int soundId = soundPool.load(assetDescriptor, 0);&
&&&&&&&&&&& soundMap.put(identifer, soundId);&&
&&&&&&& } catch (IOException e) {&
&&&&&&&&&&& throw new RuntimeException(&Couldn't load sound '& + filename + &'&);&
&&&&&&& }&
&&& }&
&&&& /**根据声音标识名播放声音
& * @param identifer 声音标识名,在加载声音load方法中被设置的
& * @param volume 播放音量
& */&
& public void play(String identifer,float volume) {&
&&&&&&&&& soundPool.play(soundMap.get(identifer), volume, volume, 0, 0, 1);&
&&&&& }&
&&&& /**根据声音标识名播放声音
& * @param identifer 声音标识名,在加载声音load方法中被设置的
& */&
& public void play(String identifer) {&
&&&&&&&&& soundPool.play(soundMap.get(identifer), 1, 1, 0, 0, 1);&
&&&&& }&
&&&& /**卸载声音
&& * @param identifer 声音标识名,在加载声音load方法中被设置的
&& * @return
&& */&
& public boolean unload(String identifer) {&
&&&&&&&& return soundPool.unload(soundMap.get(identifer));&
&&&&& }&
package com.gaofeng.
import java.io.IOE
import java.util.*;
import android.app.A
import android.content.res.AssetFileD
import android.content.res.AssetM
import android.media.AudioM
import android.media.SoundP
public class AndroidSoundPool {
&AssetM
&&& SoundPool soundP
&& HashMap&String,Integer& soundMap=new HashMap&String,Integer&();
&public AndroidSoundPool(Activity activity) {
&&activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
&&&&&&& this.assets = activity.getAssets();
&&&&&&& this.soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
&/** 从asset中加载声音文件
& * @param filename 声音文件名
& * @param identifer 声音标识名,在播放声音时调用
& */
&public void load(String filename,String identifer) {
&&&&&&& try {
&&&&&&&&&&& AssetFileDescriptor assetDescriptor = assets.openFd(filename);
&&&&&&&&&&& int soundId = soundPool.load(assetDescriptor, 0);
&&&&&&&&&&& soundMap.put(identifer, soundId);
&&&&&&& } catch (IOException e) {
&&&&&&&&&&& throw new RuntimeException(&Couldn't load sound '& + filename + &'&);
&&&&&&& }
&&& /**根据声音标识名播放声音
& * @param identifer 声音标识名,在加载声音load方法中被设置的
& * @param volume 播放音量
& */
&public void play(String identifer,float volume) {
&&&&&&&& soundPool.play(soundMap.get(identifer), volume, volume, 0, 0, 1);
&&&& }
&&& /**根据声音标识名播放声音
& * @param identifer 声音标识名,在加载声音load方法中被设置的
& */
&public void play(String identifer) {
&&&&&&&& soundPool.play(soundMap.get(identifer), 1, 1, 0, 0, 1);
&&&& }
&&& /**卸载声音
& * @param identifer 声音标识名,在加载声音load方法中被设置的
& * @return
&public boolean unload(String identifer) {
&&&&&&& return soundPool.unload(soundMap.get(identifer));
&&&& }
AndroidSoundPool 通过内置一个 HashMap&String,Integer& 实现了音效和声音标识的映射,使用的时候需要首先调用load方法加载音效文件,指定声音标识,然后再通过play方法根据音效对应的声音标识进行播放。
下面是AndroidSoundPool 的使用方法:
[java] import com.gaofeng.game.AndroidSoundP&
import android.app.A&
import android.os.B&
import android.util.L&
import android.view.MotionE&
import android.view.V&
import android.view.View.OnTouchL&
import android.widget.TextV&
public class AudioTest extends Activity implements OnTouchListener {&
& AndroidSoundP&
& @Override&
& public void onCreate(Bundle savedInstanceState) {&
&&&&& super.onCreate(savedInstanceState);&
&&&&& TextView textView = new TextView(this);&
&&&&& textView.setOnTouchListener(this);&
&&&&& setContentView(textView);&
&&&&&&& //创建AndroidSoundPool&&
&&&& andoridsoundpool = new AndroidSoundPool(this);&
&//加载声音文件explode.ogg,指定该声音标识为:sExplode&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&& andoridsoundpool.load(&explode.ogg&, &sExplode&);&
& @Override&
& public boolean onTouch(View v, MotionEvent event) {&
&&&&& if (event.getAction() == MotionEvent.ACTION_UP) {&
&&&&&&&& //根据声音标识sExplode播放声音文件&&
&&&&&&&& andoridsoundpool.play(&sExplode&);&
&&&&& }&
&&&&&&
import com.gaofeng.game.AndroidSoundP
import android.app.A
import android.os.B
import android.util.L
import android.view.MotionE
import android.view.V
import android.view.View.OnTouchL
import android.widget.TextV
public class AudioTest extends Activity implements OnTouchListener {
&AndroidSoundP
&@Override
&public void onCreate(Bundle savedInstanceState) {
&&super.onCreate(savedInstanceState);
&&TextView textView = new TextView(this);
&&textView.setOnTouchListener(this);
&&setContentView(textView);
&&&&&&& //创建AndroidSoundPool
&&andoridsoundpool = new AndroidSoundPool(this);
&//加载声音文件explode.ogg,指定该声音标识为:sExplode&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&& andoridsoundpool.load(&explode.ogg&, &sExplode&);
&@Override
&public boolean onTouch(View v, MotionEvent event) {
&&if (event.getAction() == MotionEvent.ACTION_UP) {
&&&&&&&& //根据声音标识sExplode播放声音文件
&&&andoridsoundpool.play(&sExplode&);
MediaPlayer技术
MediaPlayer使用简单,适合做游戏的背景音乐,但资源占用量较高、延迟时间较长、不支持多个音频同时播放等。
下面介绍MediaPlayer的相关技术:
1.获取MediaPlayer实例
MediaPlayer.create(Context context,int resId);&
//参数一:上下文对象,参数二:音乐资源ID
2.MediaPlayer常用的函数
prepare();//为播放音乐文件做准备工作
start();//播放音乐
pause();//暂停音乐播放
stop();//停止音乐播放
pause()和stop()主要的区别在于:暂停播放后可以调用start()继续播放,停止音乐播放后,需要调用prepare()再调用start()进行播放音乐。
3.MediaPlayer其它常用函数
setLooping(boolean looping);//设置音乐是否循环播放,true为循环播放
seekTo(int msec);//将音乐播放跳转到某一时间点,以毫秒为单位
getDuration();//获取播放的音乐文件总时间长度
getCurrentPosition();//获取当前播放音乐时间点
仔细分析了MediaPlayer的API后,毫无疑问我们应该让事情简单些。
编写AndroidMusicPool简化音乐播放
[java] import java.io.IOE&
import java.util.HashM&
import java.util.I&
import java.util.Map.E&
import android.app.A&
import android.content.res.AssetFileD&
import android.content.res.AssetM&
import android.media.MediaP&
public class AndroidMusicPool {&
&&&& AssetM&
HashMap&String,AndroidMusic& musicMap=new HashMap&String,AndroidMusic&();&
& public AndroidMusicPool(Activity activity) {&
&&&&&& this.assets = activity.getAssets();&
&& * 从asset中加载音乐文件
&& * filename:加载的文件名
&& * identifer:声音标志名,音乐标识名,播音乐时调用
&& * */&
& public void load(String filename,String identifer) {&&&&&&
&&&&&&&&&&& AssetFileDescriptor assetDescriptor=&
&&&&&&&&& try {&
&&&&&&&&&&&&& assetDescriptor = assets.openFd(filename);&
&&&&&&&&& } catch (IOException e) {&
&&&&&&&&&&&&& e.printStackTrace();&
&&&&&&&&& }&
&&&&&&&&&&& AndroidMusic music = new AndroidMusic(assetDescriptor);&
&&&&&&&&&&& musicMap.put(identifer, music);&
&&&&&&&&&&
&&& }&
&& /**根据音乐标识符播放音乐
&& * @param identifer 音乐标识符
&& * @param volume 音量大小
&& */&
&&&& public void play(String identifer,float volume) {&
&&&&&&&& if(!musicMap.containsKey(identifer))&
&&&&&&&& musicMap.get(identifer).setVolume(volume);&
&&&&&&&& musicMap.get(identifer).play();&
&&&&& }&
&&&& /*根据音乐标识符播放音乐
&&&&& * */&
&&&& public void play(String identifer) {&
&&&&&&&& if(!musicMap.containsKey(identifer))&
&&&&&&&& musicMap.get(identifer).play();&
&&&&& }&
&&& //根据音乐标识符停止音乐&&
&&&&& public void stop(String identifer) {&
&&&&&&&& if(!musicMap.containsKey(identifer))&
&&&&&&&& musicMap.get(identifer).stop();&
&&&&& }&
&&&& //根据音乐标识符设定循环播放&&
&&&& public void setLooping(String identifer,boolean isLooping) {&
&&&&&&&& if(!musicMap.containsKey(identifer))&
&&&&&&&& musicMap.get(identifer).setLooping(isLooping);&
&&&&& }&
&&&&& //根据音乐标识符暂停音乐&&
&&&& public void pause(String identifer) {&
&&&&&&&& if(!musicMap.containsKey(identifer))&
&&&&&&&& musicMap.get(identifer).pause();&
&&&& }&
&&&&&& //根据音乐标识符注销音乐&&
&&&& public void dispose(String identifer) {&
&&&&&&&& if(!musicMap.containsKey(identifer))&
&&&&&&&&&& musicMap.get(identifer).dispose();&
&&&&&&&&&& musicMap.remove(identifer);&
&&&&& }&
&&&&&& //根据音乐标识符获取音乐&&
&&&& public AndroidMusic getMusic(String identifer) throws Exception&
&&&& {&&&
&&&&&&&& if(!musicMap.containsKey(identifer))&&
throw new Exception(&no music for identifer found&) ;&
&&&&&& return& musicMap.get(identifer);&
&&&& }&&&
&&&& /*清除所有的音乐*/&
&&&& public void clear()&
&&&& {&
&&&&&&&& Iterator&Entry&String, AndroidMusic&& iter&&
&&&&&&&&&& = musicMap.entrySet().iterator();&&
&&&&&&&& while (iter.hasNext()) {&&
&&&&&&&&&&&& musicMap.get(iter.next().getKey()).dispose();&
&&&&&&&& }&&
&&&&&&&& musicMap.clear();&
&&&& }&
&&& //该类是对MediaPlayer的轻度封装&&
class AndroidMusic {&
&&& MediaPlayer mediaP&
&&& boolean isPrepared =&
&&& public AndroidMusic(AssetFileDescriptor assetDescriptor) {&
&&&&&&& mediaPlayer = new MediaPlayer();&
&&&&&&& try {&
&&&&&&&& mediaPlayer.setDataSource(assetDescriptor.getFileDescriptor(),&
&&&&&&&&&&&&&&&&&&& assetDescriptor.getStartOffset(),&
&&&&&&&&&&&&&&&&&&& assetDescriptor.getLength());&
&&&&&&&&&&& mediaPlayer.prepare();&
&&&&&&&&&&& isPrepared =&
&&&&&&& } catch (Exception e) {&
&&&&&&&&&&& throw new RuntimeException(&Couldn't load music&);&
&&&&&&& }&
&&& }&
&&& public void dispose() {&
&&&&&&& if (mediaPlayer.isPlaying())&
&&&&&&&&&&& mediaPlayer.stop();&
&&&&&&& mediaPlayer.release();&
&&& }&
&&& public boolean isLooping() {&
&&&&&&& return mediaPlayer.isLooping();&
&&& }&
&&& public boolean isPlaying() {&
&&&&&&& return mediaPlayer.isPlaying();&
&&& }&
&&& public boolean isStopped() {&
&&&&&&& return !isP&
&&& }&
&&& public void pause() {&
&&&&&&& if (mediaPlayer.isPlaying())&
&&&&&&&&&&& mediaPlayer.pause();&
&&& }&
&&& public void play() {&
&&&&&&& if (mediaPlayer.isPlaying())&
&&&&&&&&&&&&&
&&&&&&& try {&
&&&&&&&&&&& synchronized (this) {&
&&&&&&&&&&&&&&& if (!isPrepared)&
&&&&&&&&&&&&&&&&&&& mediaPlayer.prepare();&
&&&&&&&&&&&&&&& mediaPlayer.start();&
&&&&&&&&&&& }&
&&&&&&& } catch (IllegalStateException e) {&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& } catch (IOException e) {&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& }&
&&& }&
&&& public void setLooping(boolean isLooping) {&
&&&&&&& mediaPlayer.setLooping(isLooping);&
&&& }&
&&& public void setVolume(float volume) {&
&&&&&&& mediaPlayer.setVolume(volume, volume);&
&&& }&
&&& public void stop() {&
&&&&&&& mediaPlayer.stop();&
&&&&&&& synchronized (this) {&
&&&&&&&& isPrepared =&
&&&&&&& }&
&&& }&
import java.io.IOE
import java.util.HashM
import java.util.I
import java.util.Map.E
import android.app.A
import android.content.res.AssetFileD
import android.content.res.AssetM
import android.media.MediaP
public class AndroidMusicPool {
&&& AssetM
HashMap&String,AndroidMusic& musicMap=new HashMap&String,AndroidMusic&();
&public AndroidMusicPool(Activity activity) {
&& this.assets = activity.getAssets();
& * 从asset中加载音乐文件
& * filename:加载的文件名
& * identifer:声音标志名,音乐标识名,播音乐时调用
& * */
&public void load(String filename,String identifer) {&
&&&&&&&&&&& AssetFileDescriptor assetDescriptor=
&&&try {
&&&&assetDescriptor = assets.openFd(filename);
&&&} catch (IOException e) {
&&&&e.printStackTrace();
&&&&&&&&&&& AndroidMusic music = new AndroidMusic(assetDescriptor);
&&&&&&&&&&& musicMap.put(identifer, music);
&&&&&&&&
&& /**根据音乐标识符播放音乐
& * @param identifer 音乐标识符
& * @param volume 音量大小
&&& public void play(String identifer,float volume) {
&&&& if(!musicMap.containsKey(identifer))
&&&& musicMap.get(identifer).setVolume(volume);
&&&& musicMap.get(identifer).play();
&&&& }
&&& /*根据音乐标识符播放音乐
&&&& * */
&&& public void play(String identifer) {
&&&& if(!musicMap.containsKey(identifer))
&&&& musicMap.get(identifer).play();
&&&& }
&& //根据音乐标识符停止音乐
&&&&& public void stop(String identifer) {
&&&& if(!musicMap.containsKey(identifer))
&&&& musicMap.get(identifer).stop();
&&&& }
&&&& //根据音乐标识符设定循环播放
&&& public void setLooping(String identifer,boolean isLooping) {
&&&& if(!musicMap.containsKey(identifer))
&&&& musicMap.get(identifer).setLooping(isLooping);
&&&& }
&&&&& //根据音乐标识符暂停音乐
&&& public void pause(String identifer) {
&&&& if(!musicMap.containsKey(identifer))
&&&& musicMap.get(identifer).pause();
&&&&&& //根据音乐标识符注销音乐
&&& public void dispose(String identifer) {
&&&& if(!musicMap.containsKey(identifer))
&&&&&& musicMap.get(identifer).dispose();
&&&&&& musicMap.remove(identifer);
&&&& }
&&&&&& //根据音乐标识符获取音乐
&&& public AndroidMusic getMusic(String identifer) throws Exception
&&& {&
&&&& if(!musicMap.containsKey(identifer))
throw new Exception(&no music for identifer found&) ;
&& return& musicMap.get(identifer);
&&& }&
&&& /*清除所有的音乐*/
&&& public void clear()
&&&& Iterator&Entry&String, AndroidMusic&& iter
&&&&&&&&&& = musicMap.entrySet().iterator();
&&&& while (iter.hasNext()) {
&&&&&&&& musicMap.get(iter.next().getKey()).dispose();
&&&& }
&&&& musicMap.clear();
&&& //该类是对MediaPlayer的轻度封装
class AndroidMusic {
&&& MediaPlayer mediaP
&&& boolean isPrepared =
&&& public AndroidMusic(AssetFileDescriptor assetDescriptor) {
&&&&&&& mediaPlayer = new MediaPlayer();
&&&&&&& try {
&&&&&&&& mediaPlayer.setDataSource(assetDescriptor.getFileDescriptor(),
&&&&&&&&&&&&&&&&&&& assetDescriptor.getStartOffset(),
&&&&&&&&&&&&&&&&&&& assetDescriptor.getLength());
&&&&&&&&&&& mediaPlayer.prepare();
&&&&&&&&&&& isPrepared =
&&&&&&& } catch (Exception e) {
&&&&&&&&&&& throw new RuntimeException(&Couldn't load music&);
&&&&&&& }
&&& public void dispose() {
&&&&&&& if (mediaPlayer.isPlaying())
&&&&&&&&&&& mediaPlayer.stop();
&&&&&&& mediaPlayer.release();
&&& public boolean isLooping() {
&&&&&&& return mediaPlayer.isLooping();
&&& public boolean isPlaying() {
&&&&&&& return mediaPlayer.isPlaying();
&&& public boolean isStopped() {
&&&&&&& return !isP
&&& public void pause() {
&&&&&&& if (mediaPlayer.isPlaying())
&&&&&&&&&&& mediaPlayer.pause();
&&& public void play() {
&&&&&&& if (mediaPlayer.isPlaying())
&&&&&&&&&&&
&&&&&&& try {
&&&&&&&&&&& synchronized (this) {
&&&&&&&&&&&&&&& if (!isPrepared)
&&&&&&&&&&&&&&&&&&& mediaPlayer.prepare();
&&&&&&&&&&&&&&& mediaPlayer.start();
&&&&&&&&&&& }
&&&&&&& } catch (IllegalStateException e) {
&&&&&&&&&&& e.printStackTrace();
&&&&&&& } catch (IOException e) {
&&&&&&&&&&& e.printStackTrace();
&&&&&&& }
&&& public void setLooping(boolean isLooping) {
&&&&&&& mediaPlayer.setLooping(isLooping);
&&& public void setVolume(float volume) {
&&&&&&& mediaPlayer.setVolume(volume, volume);
&&& public void stop() {
&&&&&&& mediaPlayer.stop();
&&&&&&& synchronized (this) {
&&&&&&&& isPrepared =
&&&&&&& }
}以上代码中包含两个类AndroidMusic 和 AndroidMusicPool ,AndroidMusic 其实是对MediaPlayer的轻度封装,在AndroidMusicPool中会调用AndroidMusic 进行音乐播放,而AndroidMusicPool可以看作音乐容器, 通过内置一个 HashMap 实现了音乐和音乐标识的映射,使用的时候需要首先调用load方法加载音乐文件,指定音乐标识,然后再通过play方法根据音乐标识进行播放。
如果上述代码让你感到疑惑,也不必太纠结了,因为重要的是知道如何去使用,请看下面的实例代码:
使用AndroidMusicPool 播放音乐
以下代码演示:当我们轻触屏幕时,音乐就会响起。
[java] public class AudioTest extends Activity implements OnTouchListener {&
& AndroidMusicP&
& @Override&
& public void onCreate(Bundle savedInstanceState) {&
&&&&& super.onCreate(savedInstanceState);&
&&&&& TextView textView = new TextView(this);&
&&&&& textView.setOnTouchListener(this);&
&&&&& setContentView(textView);&
&&&&& musicpool = new AndroidMusicPool(this);&
&&&&&&& //从assets中加载音乐文件music.mp3,并设定其音乐标识为:mMusic&&
&&&& musicpool.load(&music.mp3&, &mMusic&);&
& @Override&
& public boolean onTouch(View v, MotionEvent event) {&
&&&&& if (event.getAction() == MotionEvent.ACTION_UP) {&
&&&&&&& //根据音乐标识mMusic播放音乐&&
&&&&&&&&& musicpool.play(&mMusic&);&
&&&&& }&
&&&&&&
public class AudioTest extends Activity implements OnTouchListener {
&AndroidMusicP
&@Override
&public void onCreate(Bundle savedInstanceState) {
&&super.onCreate(savedInstanceState);
&&TextView textView = new TextView(this);
&&textView.setOnTouchListener(this);
&&setContentView(textView);
&&musicpool = new AndroidMusicPool(this);
&&&&&&& //从assets中加载音乐文件music.mp3,并设定其音乐标识为:mMusic
&&musicpool.load(&music.mp3&, &mMusic&);
&@Override
&public boolean onTouch(View v, MotionEvent event) {
&&if (event.getAction() == MotionEvent.ACTION_UP) {
&&&&&&& //根据音乐标识mMusic播放音乐
&&&musicpool.play(&mMusic&);
AndroidMusicPool通过短短两行代码就实现了音乐的加载和播放,简单吧,但是请记住,在调用播放方法play之前,务必先调用load方法加载音乐文件,并指定音乐标识。}