前些天在尝试自己写一个Android小游戏——flybird
基本功能实现了,就想添加声音,然后上网查了查,大多是一样,可是用到我这,有些却不可以用,所以我还用了两种方法。
下面谈谈这两种方法。
方法一:这是使用Java中的多线程,另外new出一个类,用类来启动音乐。
这个方法,就像当初写java的小游戏一样,不过是在电脑上运行的,可以控制每一个动作,比如你的触碰动作,但是,在我这个游戏中,我需要的不是一点的音乐,虽 然后期会用到,而是一开始就有的。
不过,用这个方法,没用service,就是开起来的时候,会很卡,而且会闪退。
- package com.example.flybird_anla;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.Random;
- import android.content.Context;
- import android.media.AudioManager;
- import android.media.MediaPlayer;
- import android.media.SoundPool;
- public class SoundPlayer {
- private static MediaPlayer music;
- private static SoundPool soundPool;
- private static boolean musicSt = true; //音乐开关
- private static boolean soundSt = true; //音效开关
- private static Context context;
- private static final int[] musicId = {R.raw.paopao};
- private static Map<Integer,Integer> soundMap; //音效资源id与加载过后的音源id的映射关系表
- public static void init(Context c)
- {
- context = c;
- initMusic();
- initSound();
- }
- //初始化音效播放器
- private static void initSound()
- {
- soundPool = new SoundPool(10,AudioManager.STREAM_MUSIC,100);
- soundMap = new HashMap<Integer,Integer>();
- soundMap.put(R.raw.paopao, soundPool.load(context, R.raw.paopao, 1));
- soundMap.put(R.raw.boung, soundPool.load(context, R.raw.boung, 1));
- }
- //初始化音乐播放器
- private static void initMusic()
- {
- int r = new Random().nextInt(musicId.length);
- music = MediaPlayer.create(context,musicId[r]);
- music.setLooping(true);
- }
- public static void playSound(int resId)
- {
- if(soundSt == false)
- return;
- Integer soundId = soundMap.get(resId);
- if(soundId != null)
- soundPool.play(soundId, 1, 1, 1, 0, 1);
- }
- /**
- * 暂停音乐
- */
- public static void pauseMusic()
- {
- if(music.isPlaying())
- music.pause();
- }
- /**
- * 播放音乐
- */
- public static void startMusic()
- {
- if(musicSt)
- music.start();
- }
- /**
- * 切换一首音乐并播放
- */
- public static void changeAndPlayMusic()
- {
- if(music != null)
- music.release();
- initMusic();
- startMusic();
- }
- /**
- * 获得音乐开关状态
- * @return
- */
- public static boolean isMusicSt() {
- return musicSt;
- }
- /**
- * 设置音乐开关
- * @param musicSt
- */
- public static void setMusicSt(boolean musicSt) {
- SoundPlayer.musicSt = musicSt;
- if(musicSt)
- music.start();
- else
- music.stop();
- }
- /**
- * 获得音效开关状态
- * @return
- */
- public static boolean isSoundSt() {
- return soundSt;
- }
- /**
- * 设置音效开关
- * @param soundSt
- */
- public static void setSoundSt(boolean soundSt) {
- SoundPlayer.soundSt = soundSt;
- }
- /**
- * 发出‘邦’的声音
- */
- public static void boom()
- {
- playSound(R.raw.boung);
- }
- }
方法二:
这种方法是利用android中的service来开启,也就是进去的时候就播放出,退出就停止。
首先,在AndroidManifest中的application节点下添加:
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- package com.example.flybird_anla;
- import android.app.Service;
- import android.content.Intent;
- import android.media.MediaPlayer;
- import android.os.IBinder;
- public class MusicServer extends Service {
- private MediaPlayer mediaPlayer;
- @Override
- public IBinder onBind(Intent intent) {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
- public void onStart(Intent intent, int startId) {
- super.onStart(intent, startId);
- if (mediaPlayer == null) {
- // R.raw.mmp是资源文件,MP3格式的
- mediaPlayer = MediaPlayer.create(this, R.raw.paopao);
- mediaPlayer.setLooping(true);
- mediaPlayer.start();
- }
- }
- @Override
- public void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- mediaPlayer.stop();
- }
- }
最后,在在activity中,写两个函数:
- protected void onCreate(Bundle savedInstanceState) {
- Intent intent = new Intent(MainActivity.this,MusicServer.class);
- super.onCreate(savedInstanceState);
- startService(intent);
- manu();
- }
- protected void onStop(){
- Intent intent = new Intent(MainActivity.this,MusicServer.class);
- stopService(intent);
- super.onStop();
- }