繁体   English   中英

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

[英]How do I know if a sound is finished playing in android?

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

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

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

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

使用MediaPlayer类和OnCompletionListener

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

我解决这个问题的方法是创建一个包含图像,声音和延迟的动画序列。 然后,我可以将它们排队,这样我就可以显示图像,并伴随声音,然后切换到另一个图像。 我使用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);

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

希望这可以帮助。

对不起,现在回复已经太晚了。 但是我使用了来自mediaplayer的isPlaying()API来等待第一首歌完成。

while(mediaPlyaer.isPlaying()){
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM