6

我如何知道声音是否已播放完毕?

我想播放 2 种声音,但我想播放一种声音,然后等到第 1 种声音完成后再开始第 2 种声音。

另外,如果我想在声音完成后做其他事情,比如在视图鳍状体中显示他的下一个视图,我可以这样做吗?

现在我正在使用 SoundPool 播放我的声音。

4

4 回答 4

3

使用MediaPlayer类和 OnCompletionListener

于 2010-11-30T23:52:35.210 回答
1

只是一个想法...获取 ogg/wav 声音播放时间长度并使用您自己的 SoundObject 类和计时器成员。在一些更新功能中更新它。如果 timer > maxtime + threshold,将其标记为已完成。

于 2013-06-19T09:28:41.350 回答
0

我解决这个问题的方法是创建一个包含图像、声音和延迟的动画序列。然后我可以将它们排队,这样我就可以显示图像,并伴随声音,然后切换到另一个图像。我使用 SoundPlayer 和自定义视图(不是视图翻转器,虽然你可能可以)来做到这一点

诀窍是您不能简单地暂停线程以延迟,您需要使用处理程序向自己发送消息以在将来更新 UI。

这是处理程序

handler = new Handler() {

            /* (non-Javadoc)
             * @see android.os.Handler#handleMessage(android.os.Message)
             */
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == NEXT_ITEM_MSG) {
                    showNext();
                }
                else if (msg.what == SEQUENCE_COMPLETE_MSG) {
                    // notify the listener
                    if (animationCompleteListener != null) {
                        animationCompleteListener.onAnimationComplete();
                    }
                }
            }
        };

showNext() 方法简单地抓取序列中的下一个项目,更新图像视图,播放声音,然后为处理程序安排一条消息,以便在序列之后调用 showNext。

private void showNext() {
        if (mRunning) {
            // Get the first item
            AnimatedSequenceItem item = currentSequence.getNextSequenceItem();
            if (item == null) {
                Message msg = handler.obtainMessage(SEQUENCE_COMPLETE_MSG);
                handler.sendMessage(msg);
                return;
            }
            // Show the first image
            showImage(item.getImageResId());
            // Play the sound
            int iSoundResId = item.getSoundResId();
            if (iSoundResId != -1) {
                playSound(iSoundResId);
            }

            // schedule a message to advance to next item after duration
            Message msg = handler.obtainMessage(NEXT_ITEM_MSG);
            handler.sendMessageDelayed(msg, item.getDuration());
        }
    }

当然,所有这些都需要您确定延迟并对其进行硬编码,但根据我的经验,无论如何您都需要为游戏这样做。在很多情况下,我希望延迟比声音长。这是实际排队项目的代码。

battleSequence.addSequenceItem(R.drawable.brigands, 
                   R.raw.beep, 
                   2000);
battleSequence.addSequenceItem(R.drawable.black,
                               winning ? R.raw.enemy_hit : R.raw.player_hit, 
                               1500);

使用这种方法,我可以使用各种逻辑来添加动画项、更改持续时间、循环动画等……只需进行一些微调即可正确处理延迟。

希望这可以帮助。

于 2013-10-16T19:07:41.117 回答
0

抱歉,回复太晚了。但是我使用了来自 mediaplayer 的 isPlaying() API 来等待第一首歌曲完成。

while(mediaPlyaer.isPlaying()){
}
于 2014-04-10T15:56:26.487 回答