12

我正在用 Android 开发一个简单的游戏。我想为每个触摸事件添加声音效果。但是我添加了贯穿整个游戏的背景音效。但是如何为触摸游戏的任何角色添加微小的声音效果。为了更好地理解以下是我的类设计:我有一个主要活动,我从视图中调用我的 GameView 类来扩展surfaceView。对于免费的声音,我刚刚在 mainActivity 创建了声音,然后调用了 GameView 类,如下所示:

public class MainActivity extends Activity {
    MediaPlayer backgroundMusic;



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
         backgroundMusic = MediaPlayer.create(MainActivity.this, R.raw.bg);


         backgroundMusic.setLooping(true);
         backgroundMusic.setVolume(10.0f, 3.0f);
         backgroundMusic.start();

        setContentView(new GameView(this));
    }
}

以下是我的 GameView 课程。我想在此类 onTouchEvent 中添加音效,如下所示:

public class GameView extends SurfaceView {
 @Override
 public boolean onTouchEvent(MotionEvent event) {
   //checking condition I want to give different sound here.

  }
}

我尝试将其作为 mainActivity (即使用 MediaPlayer.creat() ),但它显示错误。有人知道如何根据我的班级设计添加这样的音效吗?

4

3 回答 3

56

对于爆炸,硬币收集等短音效,最好使用SoundPool

您只需要创建一个声音池:

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

在 Lollipop 及更高版本中:

AudioAttributes attrs = new AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_GAME)
        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
        .build();
SoundPool sp = new SoundPool.Builder()
        .setMaxStreams(10)
        .setAudioAttributes(attrs)
        .build();

这将为最大创建声音池。10 个声音流(即任何时候可以同时播放多少个声音效果)并AudioManager.STREAM_MUSIC用作声音流。

请务必在您的 中设置音量控制Activity,以便用户能够更改正确流的音量:

setVolumeControlStream(AudioManager.STREAM_MUSIC);

然后,您需要将音效加载到池中并为其提供标识符:

int soundIds[] = new int[10];
soundIds[0] = sp.load(context, R.raw.your_sound, 1);
//rest of sounds goes here

您需要将上下文传递给加载方法,因此您可以在活动中执行此操作,或者从其他地方获取。

播放声音的最后一步是调用play方法:

sp.play(soundIds[0], 1, 1, 1, 0, 1.0);

参数是:

  • soundID load() 函数返回的 soundID

  • leftVolume 左音量值(范围 = 0.0 到 1.0)

  • rightVolume右音量值(范围 = 0.0 到 1.0)

  • 优先级 流优先级(0 = 最低优先级)

  • 循环 循环模式(0 = 无循环,-1 = 永远循环)

  • rate 播放速率(1.0 = 正常播放,范围 0.5 到 2.0)

您需要记住,SoundPool不应使用超过 1MB 的媒体文件,文件越小,效果和性能就越好。

完成后一定要释放SoundPool,或者在Activity.onDestroy.

sp.release();

希望这可以帮助

于 2013-10-11T06:42:11.750 回答
2

GameView 不是 Context 的子类。将 Activity 或 ApplicationContext 传递给 Mediaplayer

于 2013-10-09T13:08:51.617 回答
0

只需执行以下操作...

MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.combo);
mp.start();

我在如何在 Android 中播放音效中找到了它

于 2014-08-01T04:55:11.200 回答