Я решил это путем создания анимационной последовательности, содержащей изображение, звук и задержку.Затем я могу поставить их в очередь, чтобы можно было показать изображение и сопровождать его звуком, а затем переключиться на другое изображение.Я делаю это с помощью SoundPlayer и пользовательского представления (а не флиппера, хотя вы, вероятно, могли бы)
Хитрость заключается в том, что вы не можете просто приостановить поток для задержки, вам нужно использоватьобработчик для отправки себе сообщения об обновлении пользовательского интерфейса в будущем.
Вот обработчик
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);
При таком подходе я могу использовать всевозможную логику для добавления элементов анимации, изменения длительности, анимации цикла и т. Д. Просто потребовалась небольшая настройкапонять задержки правильно.
Надеюсь, это поможет.