SoundPool和MediaPlay
SoundPool和MediaPlay都是用来播放音乐的类,这两个类的主要的区别是:
SoundPool一般是用来播放比较短的实时性要求比较强的音乐,所以SoundPool一般是用来播放游戏中的音效:点击某个按钮时的声音、子弹发出去时候的声音、碰撞时发出的声音、点击菜单中的菜单项时发出的声音。
MediaPaly一般是用来播放的背景音乐,适用于实时性要求不高的,播放时间较长的音乐。
1.创建一个能使用SoundPool来实现播放音效的类SoundPlay:
2.创建一个单线程用来保存音效按钮的开关,SettingManager和Setting:import java.util.HashMap; import com.up.R; import android.content.Context; import android.media.AudioManager; import android.media.SoundPool; public class SoundPlay { SoundPool soundPool;//创建一个SoundPool的类 HashMap<Integer,Integer> soundPoolMap;//HashMap类将音乐对应到键值 int streamVolume; public SoundPlay(Context context){ initSoundPool(context); }//context为调用该SoundPlay的类,调用SoundPlay类的这个类继承自View public void initSoundPool(Context context){ soundPool = new SoundPool(100,AudioManager.STREAM_MUSIC,1); soundPoolMap=new HashMap<Integer,Integer>(); AudioManager audioManager=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE); streamVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); addSoundToHashMap(context); }//使用context获得当前手机的声音 public void addSoundToHashMap(Context context){ soundPoolMap.put(R.raw.attack02, soundPool.load(context, R.raw.attack02, 1)); soundPoolMap.put(R.raw.attack14, soundPool.load(context, R.raw.attack14, 1)); soundPoolMap.put(R.raw.cricket, soundPool.load(context,R.raw.cricket,1)); }//将你的音乐文件添加到HashMap中,并且使SoundPool加载该音乐文件 public void playSound(int sound,int num){ soundPool.play(soundPoolMap.get(sound), streamVolume, streamVolume, 1, num, 1); }//使用HashMap中的键值来播放音乐 }
public class SettingManager { private static SettingManager mSettingManager;//静态的成员变量 private Context mContext; private SharedPreferences mSharedPreferences;//轻量级数据库,用来存储音乐和音效按钮是否为开启状态 private SharedPreferences.Editor mEditor;//由于SharedPreferences智能读取XML文件中的数据,不能修改XML文件中的数据,所以得使用Editor来对数据库进行修改 public Setting setting = null; public static final String SETTING = "setting";
public static final String KEY_IS_MUSIC_ON = "is_music_on";public static final String KEY_IS_SOUND_ON = "is_sound_on"; private SettingManager() { mContext = Application.getContext();//使用Application来获得Context mSharedPreferences = mContext.getSharedPreferences(SETTING, 0); mEditor = mSharedPreferences.edit(); if(setting == null) { setting = new Setting(); setting.is_music_on = mSharedPreferences.getBoolean(KEY_IS_MUSIC_ON, false); setting.is_sound_on = mSharedPreferences.getBoolean(KEY_IS_SOUND_ON, false); } } //使用synchronized来定义该方法为单线程的,当mSettingManager没有被初始化的时候就将定义该static变量,使用的时候为SettingManager.getInstance().getSettingBooleanInfo(SettingManger.KEY_IS_MUSIC_ON); public static synchronized SettingManager getInstance() { if (mSettingManager == null) { mSettingManager = new SettingManager(); } return mSettingManager; } //设置背景音乐和音效按钮的状态,若为关闭状态则SharedPreferences中的"is_music_on"对应的值为false,否则为true public void setSettingBooleanInfo(String tag, boolean flag) { if (null == mContext || mEditor == null) { return ; } mEditor.putBoolean(tag, flag).commit(); if(tag.equals(KEY_IS_MUSIC_ON)) { setting.is_music_on = flag; } else if(tag.equals(KEY_IS_SOUND_ON)) { setting.is_sound_on = flag; } }//从ShredPreferences数据库中得到音乐和音效按钮的状态信息 public boolean getSettingBooleanInfo(String tag) { if(null == mSharedPreferences) { return false; } return mSharedPreferences.getBoolean(tag, false); }}public class Setting { /** * 背景音乐 */ public boolean is_music_on; /** * 音效 */ public boolean is_sound_on;}
3.在Activity中使用下面的语句来实现音效的播放
if(SettingManager.getInstance().getSettingBooleanInfo(SettingManager.KEY_IS_SOUND_ON)) soundPlay.playSound(R.raw.cricket, 1);