如果问题是您想控制离散声音之间的间隔,最简单的方法是使用处理程序。
基本上,您开始播放声音,这是一个异步过程。然后,您使用处理程序安排消息在未来某个时间播放下一个声音。需要一些试验和错误才能使其正确,但您可以保证声音将在每台设备上的前一个声音之后以相同的间隔开始。
这是一些代码来说明我在说什么。
这是您可以使用的处理程序实现:
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) {
playNextSound();
}
else if (msg.what == SEQUENCE_COMPLETE_MSG) {
// notify a listener
listener.onSoundComplete()
}
}
};
然后你可以这样写 playNextSound:
private void playNextSound() {
if (mRunning) {
// Get the first item
SoundSequenceItem item = currentSequence.getNextSequenceItem();
if (item == null) {
Message msg = handler.obtainMessage(SEQUENCE_COMPLETE_MSG);
handler.sendMessage(msg);
return;
}
// Play the sound
int iSoundResId = item.getSoundResId();
if (iSoundResId != -1) {
player.playSoundNow(soundResId);
}
// schedule a message to advance to next item after duration
Message msg = handler.obtainMessage(NEXT_ITEM_MSG);
handler.sendMessageDelayed(msg, item.getDuration());
}
}
并且您的 SoundSequenceItem 可能只是一个具有声音文件资源 ID 和持续时间的简单类。如果您想在角色移动时继续播放声音,您可以执行以下操作:
public void onSoundComplete() {
if (character.isRunning()) {
currentSequence.addSequenceItem(new SoundSequenceItem(R.id.footsteps,500);
playNextSound();
}
}
或者您可以修改 playNextSound 以连续播放相同的声音。我是这样写的,以便能够按顺序播放不同的声音。