我怎么知道声音是否在Android中播放完毕?

时间:2010-11-30 23:37:54

标签: android soundpool

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

我想播放2个声音,但我想要播放一个声音,然后等到第2个声音在第2个开始之前完成。

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

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

4 个答案:

答案 0 :(得分:3)

使用MediaPlayer类和OnCompletionListener

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

这是Handler

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);

通过这种方法,我可以拥有各种逻辑来添加动画项目,更改持续时间,循环动画等等......只需要进行一些微调即可获得正确的延迟。

希望这有帮助。

答案 3 :(得分:0)

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

while(mediaPlyaer.isPlaying()){
}