按下 ImageButton 重叠声音

Posted

技术标签:

【中文标题】按下 ImageButton 重叠声音【英文标题】:Overlaping sounds with push of ImageButton 【发布时间】:2015-10-27 09:57:36 【问题描述】:

我正在制作一个播放用户选择的声音的应用。他们首先选择类别,然后选择特定的声音。声音不是很长,目前该应用程序将播放声音就好了。但是,如果用户选择一种声音,然后他们选择第二种声音来播放,这两种声音会重叠(Beta 测试人员显然觉得这很烦人)。我已经尝试过媒体播放器和声音池。在研究了这个问题后,我发现重叠的可能原因是我使用mp = mediaplayer.create(this,raw.soundfile); mp.start() 来播放每个声音。从那以后,我试图改变声音的播放方式。在阅读了包括this tutorial在内的几篇文章后,下面是我目前拥有的相关代码

public class [classname] implements [something] extends[somethingelse]
    MediaPlayer mp; //moved out of play sound method

        protected void OnCreate(Bundle savedInstanceState)
          mp = new MediaPlayer();// added to this area
        
        public void playSound (View view) 

           if (mp.isPlaying() )
              mp.stop();
              mp.release();
              
           switch (selection) 
                            case "sound1":
                                mp = MediaPlayer.create(this, R.raw.sound1);
                                mp.start();
                                break;
                            case "sound2":
                                mp = MediaPlayer.create(this, R.raw.sound2);
                                mp.start();
                                break;
                            case "sound3":
                                mp = MediaPlayer.create(this, R.raw.asound3);
                                mp.start();
                                break; 
    **10 more cases in this playsound method**

经过 Udi Idan 的反复试验和帮助,上面的代码是目前在我的应用程序中运行的代码。

【问题讨论】:

【参考方案1】:

如果你想避免重叠,你应该检查天气正在播放的声音并停止它:

if (mp != null && mp.isPlaying())
    mp.pause();

然后播放新的声音。

编辑

您应该与播放声音的方式保持一致。

创建一个 MediaPlayer 变量作为类成员:

MediaPlayer mp;

if (mp != null && mp.isPlaying())
    mp.stop();


switch (selection) 
                    case "sound1":
                       mp = MediaPlayer.create(this, R.raw.sound1);
                       mp.start();
                       break;
                    case "sound2":
                        mp = MediaPlayer.create(this, R.raw.sound2);
                        mp.start();
                        break;
                    case "sound3":
                        mp = MediaPlayer.create(this, R.raw.sound3);
                        mp.start();
                        break; 

【讨论】:

感谢您的提示,遗憾的是它并没有解决问题。当只是添加mp.pause(); 没有帮助时,我还添加了mp.release();。仍然重叠的声音 - 我上面的代码已经被编辑以反映这个尝试。 为什么要以不同的方式加载每个声音?在这个例子中你应该只使用 mp,否则为什么声音会停止?如果您使用 sounder 播放 sound3,使用 mp 播放 sound1? 我为造成的混乱道歉,我试图展示我已经尝试过的内容并弄乱了评论部分。我已经编辑了上面的内容,以更好地反映我的实际代码的样子,并且声音仍然重叠。 if (mp !=null && mp.isPlaying() )... 什么都不做 创建 MediaPlayer mp;作为类成员(不在方法内部) 谢谢!!它现在工作得很好。对 if 块稍作改动(如上面编辑的代码所示),它也可以正常工作。

以上是关于按下 ImageButton 重叠声音的主要内容,如果未能解决你的问题,请参考以下文章

如何播放与 AVAudioPlayer 重叠的相同声音?

ListView ImageButton 设置铃声

FLASH AS3 声音重叠

重叠声音 Actionscript 3/AIR

按下按钮后立即停止并启动声音

如何在焦点/按下时更改 ImageButton 的色调