0

我是 Android 新手,我想根据用户按下的按钮播放声音。

我设法在按下按钮时播放声音,但我必须指定要播放的文件。

我想要做的是找到一种方法来动态设置 R.raw.arthaswhat5 参数,以便将其设置为按下的最后一个按钮。

public void listen(View w){
    MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.arthaswhat5);
    mediaPlayer.start();
}

我认为以与我的文件相同的方式命名按钮可能会有所帮助,但我真的不明白这个 R 东西是如何工作的......我知道我可以让 v.getId() int 知道按下了哪个按钮,但我可以'不要使用这个ID来相应地播放声音......

4

3 回答 3

1

您想使用声音池 http://developer.android.com/reference/android/media/SoundPool.html

在您的“res”文件夹中添加一个名为“raw”的文件夹并将您的声音文件放在那里。我使用了 .m4a 文件,它对我有用,但我不确定还支持哪些其他格式。

这是我在应用程序中使用的代码片段,使用以下代码播放声音:

int flip = 1,scratch = 2,wrong = 3,correct = 4,pop = 5;
SoundPool soundPool;
HashMap<Integer, Integer> soundPoolMap;

setVolumeControlStream(AudioManager.STREAM_MUSIC);

soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 100);
soundPoolMap = new HashMap<Integer, Integer>();
soundPoolMap.put(flip, soundPool.load(this, R.raw.flip, 1));
soundPoolMap.put(scratch, soundPool.load(this, R.raw.scratch, 1));
soundPoolMap.put(wrong, soundPool.load(this, R.raw.wrong, 1));
soundPoolMap.put(correct, soundPool.load(this, R.raw.correct, 1));
soundPoolMap.put(pop, soundPool.load(this, R.raw.pop, 1));

soundPool.play(soundPoolMap.get(flip), 1, 1, 1, 0, 1);

编辑:几乎完全忽略了你问题的一部分。您需要使用 switch/case 范围来确定单击了哪个按钮并相应地对其应用正确的声音:

public void listen(View v) {
   switch(v.getId()) {
      case (R.id.button1):
         soundPool.play(soundPoolMap.get(flip), 1, 1, 1, 0, 1);
         break;
      case (R.id.button2):
         soundPool.play(soundPoolMap.get(scratch), 1, 1, 1, 0, 1);
         break;
      case (R.id.button3):
         ...
   }
}
于 2013-09-29T08:32:18.360 回答
0

Why don't u use a switch-case statement like this?

public void listen(View v){
   MediaPlayer mediaPlayer;
   switch(v.getid()) {
      case (R.id.sound1):
         mediaPlayer = MediaPlayer.create(this, R.raw.arthaswhat5);
         mediaPlayer.start();
         break;
      case (R.id.sound2):
         mediaPlayer = MediaPlayer.create(this, R.raw.arthaswhat6);
         mediaPlayer.start();
         break;
      case (R.id.sound3):
         ...
         ...
         ...
      case (...)
         ...
         ...
         ...
   }
}
于 2013-09-29T08:35:57.393 回答
0

R.raw就像R.id指向这些值的存储位置的指针一样。

当您在 raw 文件夹下保存一些图像或 wav 文件时,在 Project refresh 后您可以像R.raw.arthaswhat5返回一样调用它int

当您添加新的 GUI 元素时,会以同样的方式R.id生成。

R.raw和之间没有依赖关系R.id。指向您的视图 XMLR.raw时指向原始文件夹。R.id

from `View` you can fetch id to you it for `if` statement or `switch`

喜欢

if (v.getId() == R.id.your_button){ /*...*/}  

[编辑]

如果你有超过 100 首歌曲,我会使用assets文件夹来代替raw。因为在raw所有名称中都必须小写,并且您不能在那里创建子目录。将难以处理和维护。

于 2013-09-29T08:28:42.843 回答