技术开发 频道

Android 游戏开发--即时音效

  【IT168技术】即时音效,顾名思义,是一个又短又快的音效,适合于播放时间较短反应迅速的音频文件,例如输入法打字时的“哒哒”声就是这个东西,下象棋时的下棋声也是...

  该技术继承自android.media.SoundPool

  SoundPool类用于和播放应用程序的声音资源,该类将声音文件加载到内存中,处于性能的考虑,一般只将时间小于7秒左右的声音文件用该技术播放。

  构造方法SoundPool(int maxStreams, int streamType, int srcQuality)

  maxStreams:该参数用于设置同时能够播放多少音效,如设置为3,则最多同时可以播放3个音效

  streamType:音频类型,在游戏中通常设置为STREAM_MUSIC

  srcQuality:音频文件的质量,默认设置为0

  加载音频文件public int load(Context context, int resId, int priority)

  context:应用程序上下文,即调用它的Activity

  resId:资源id

  priority:优先级,可以设置为1

  播放音效public final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

  soundID:播放的音乐ID

  leftVolume:用来控制左声道音量

  rightVolume:用来控制右声道音量

  priority:优先级,0最低

  loop:循环次数,0为不循环,-1为永远循环

  rate:回放速度,该值在0.5-2.0之间,1为正常速度

  暂定播放public final void pause(int streamID)

  streamID音效ID

  下面是应用这个即时音效的一个例子

  package com.loulijun.quicksound;

  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;

  public class QuickSoundActivity extends Activity {

  //创建一个声音池

  private SoundPool sp;

  HashMap map;

  private Button startOne = null;

  private Button stopOne = null;

  private Button startTwo = null;

  private Button stopTwo = null;

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  //初始化声音池

  initSoundPool();

  startOne = (Button)findViewById(R.id.startone);

  stopOne = (Button)findViewById(R.id.stopone);

  startTwo = (Button)findViewById(R.id.starttwo);

  stopTwo = (Button)findViewById(R.id.stoptwo);

  startOne.setOnClickListener(new Button.OnClickListener()

  {

  @Override

  public void onClick(View v) {

  playSound(1,1);//播放第一首音效,循环一遍

  }

  });

  stopOne.setOnClickListener(new Button.OnClickListener()

  {

  @Override

  public void onClick(View v) {

  //暂停第一首音效

  sp.pause(map.get(1));

  }

  });

  startTwo.setOnClickListener(new Button.OnClickListener()

  {

  @Override

  public void onClick(View v) {

  //播放第二首音效,循环两次

  playSound(2,2);

  }

  });

  stopTwo.setOnClickListener(new Button.OnClickListener()

  {

  @Override

  public void onClick(View v) {

  //暂定第二首音效

  sp.pause(map.get(2));

  }

  });

  }

  //声音池初始化方法

  private void initSoundPool()

  {

  sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);

  map = new HashMap();

  map.put(1, sp.load(this, R.raw.one, 1));

  map.put(2, sp.load(this, R.raw.two, 1));

  }

  //播放声音方法

  public void playSound(int sound, int number)

  {

  AudioManager am = (AudioManager)this.getSystemService(this.AUDIO_SERVICE);

  //返回当前AlarmManager最大音量

  float audioMaxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

  //返回当前AudioManager对象的音量值

  float audioCurrentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);

  float volumnRatio = audioCurrentVolume/audioMaxVolume;

  sp.play(

  map.get(sound), //播放的音乐Id

  volumnRatio, //左声道音量

  volumnRatio, //右声道音量

  1, //优先级,0为最低

  number, //循环次数,0无不循环,-1无永远循环

  1);//回放速度,值在0.5-2.0之间,1为正常速度

  }

  }

0
相关文章