如何知道声音是否播放完毕?
我想播放2个声音,但我想要播放一个声音,然后等到第2个声音在第2个开始之前完成。
另外,如果我想在声音结束时做其他事情,比如在视图鳍状肢中显示他的下一个视图,我可以这样做吗?
现在我正在使用SoundPool播放我的声音。
答案 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()){
}