前些天在尝试自己写一个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);
}
}
然后,在需要的地方new出类,在调用方法。
方法二:
这种方法是利用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>
然后,再在项目中new出一个类,MusicServer:
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();
}
然后,就ok了。