【问题标题】:Android : How to play a sound depending on the button that is pressed?Android:如何根据按下的按钮播放声音?
【发布时间】:2013-09-29 17:02:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java android audio playback


    【解决方案1】:

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

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

    这是我在应用中使用的代码的 sn-p, 要播放声音,请使用以下代码:

    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):
             ...
       }
    }
    

    【讨论】:

    • 谢谢,这会派上用场的:)
    【解决方案2】:

    R.raw 类似于 R.id 的基本词汇,例如指向这些值的存储位置的指针。

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

    通过同样的方式R.id 在添加新的 GUI 元素时生成。

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

    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 中,所有名称都必须小写,并且您不能在那里创建子目录。将难以处理和维护。

    【讨论】:

    • 好的,我明白了。但我要做的是让一个庞大的声音库(超过 100 个)可播放。根据你的说法,我将不得不创建一个 ArrayList 或类似的包含 的东西,但是我将在旅途中生成界面以使用户可以选择文件夹。你知道是否有办法获取之前生成的 GUI 元素的 id?
    • 如果你有 100 首歌曲,我会使用 assets 文件夹而不是 raw。因为在raw 中,所有名称都必须小写,您不能在那里创建子目录。 stackoverflow.com/questions/3289038/…。是的,只需创建 List 的歌曲名称
    【解决方案3】:

    你为什么不使用这样的 switch-case 语句?

    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 (...)
             ...
             ...
             ...
       }
    }
    

    【讨论】:

    • 我必须让它动态化,因为我的应用程序中会有数百种声音。我将不得不摆脱 if 语句,只需通过执行以下操作来播放声音:MediaPlayer mediaPlayer = MediaPlayer.create(this, MediaHashMap.get(buttonPressed));
    猜你喜欢
    • 2011-02-08
    • 2014-11-02
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多