【问题标题】:How to play sound on button click, even if MediaPlayer is already playing a sound?即使 MediaPlayer 已经在播放声音,如何在单击按钮时播放声音?
【发布时间】:2019-06-03 08:05:51
【问题描述】:

单击按钮时,我编写了一些代码来播放简单的声音。我希望这个声音甚至可以在以前使用相同按钮创建的声音上播放(例如,如果用户反复快速地单击按钮。

现在,在之前创建的声音完全完成之前,代码不会播放任何声音。

我尝试在单击按钮时执行 player.pause() 和 player.seekTo(0),但之前创建的声音被切断。这不是我想要的。我希望所有的声音都完整地完成。如果第一个声音仍在播放,我希望声音 2(第二个快速按钮按下)在顶部播放(声音 3、4 相同,(用户可能在第一个声音结束之前单击 5-6 次。)我应该制作 6 mediaPlayer 对象和 onclick 检查是否正在播放 1st,如果是则播放 2,如果正在播放,则播放 3 等等....?一定有更有效的方法。

在前一个声音完全播放完之前,这段代码不会播放声音:

    button = findViewById(R.id.button);
    player1 = MediaPlayer.create(this, R.raw.kick1);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            player1.start();
            return;
        }
    });

这段代码切断了之前创建的声音:

    button = findViewById(R.id.button);
    player1 = MediaPlayer.create(this, R.raw.kick1);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            player1.pause();
            player1.seekTo(0);
            player1.start();
            return;
        }
    });

如何在每次点击时播放声音,并重叠之前创建的声音? (如果用户足够快地点击按钮到需要的地方)?

【问题讨论】:

  • 想到了一些事情:我是否应该在每次点击时创建新的 MediaPlayer 对象,然后在它们播放声音后销毁它们?这样做安全吗/内存效率高?

标签: android button audio android-mediaplayer


【解决方案1】:

您必须为每次播放声音创建一个新播放器,试试这个。我没有测试过。

button = findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        MediaPlayer player = MediaPlayer.create(this, R.raw.kick1);
        player.start();
    }
});

【讨论】:

  • 但是如果用户点击 100 次,我将创建 100 个 MediaPlayer 对象...应用程序不会运行缓慢/崩溃吗?
  • 您最多想创建多少?垃圾收集器会删除所有没有引用的对象,所以过一段时间就会被删除。
  • 用户可以无限点击。如果我可以只使用 1 个 MediaPlayer 对象,那将是理想的。
  • 那么这可能是答案,也许你可以拥有一个最多 10 或 20 个媒体播放器的数组并在其上递增编辑:把你的对象想象成一个真正的 cd 播放器,如果你按下播放,声音播放,按多次播放后什么都不会发生,所以你需要另一个玩家同时播放声音
  • 我认为增加 10 个以上的媒体播放器可能是解决方案。我现在正在尝试编写代码,我会告诉你它是如何工作的
【解决方案2】:

Dinesh 的回答差不多了,只是你需要保留创建的 MediaPlayer。

MediaPlayer mPlayer = null;

    if (mPlayer != null && mPlayer.isPalying()) {
      mPlayer.stop();
      ...
    }
    mPlayer = MediaPlayer.create(mContext, raw);
    ...

因为如果您播放不同的原始文件,则会创建不同的 MediaPlayer。

【讨论】:

  • 我希望每次单击按钮时播放相同的原始文件,并且我希望声音重叠(如果重复按下按钮)。你的代码不会切断之前创建的声音吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多