サウンドの再生が終了したかどうかはどうすればわかりますか?
2つのサウンドを再生したいのですが、1つのサウンドを再生してから、1番目のサウンドが完了するまで待ってから2番目のサウンドを開始します。
また、ビューフリッパーで次のビューを表示するなど、サウンドが終了したときに何か他のことをしたい場合は、それを行うことができますか?
現在、SoundPoolを使用してサウンドを再生しています。
MediaPlayerクラスと OnCompletionListenerを使用する
ちょっとしたアイデア... ogg / wavサウンドの再生時間の長さを取得し、タイマーメンバーで独自のSoundObjectクラスを使用します。いくつかの更新機能で更新します。タイマー > maxtime + しきい値の場合、終了としてフラグを立てます。
申し訳ありませんが、これは返信が遅すぎます。しかし、私は mediaplayer の isPlaying() API を使用して、最初の曲が完了するのを待ちました。
while(mediaPlyaer.isPlaying()){
}
これを解決する方法は、画像、サウンド、および遅延を含むアニメーション シーケンスを作成することです。これらをキューに入れて、画像を表示し、それに付随するサウンドを表示してから、別の画像に切り替えることができます。私はSoundPlayerとカスタムビューでこれを行います(ビューフリッパーではありませんが、おそらく可能です)
トリックは、遅延のためにスレッドを単純に一時停止することはできないということです。今後 UI を更新するには、ハンドラーを使用して自分自身にメッセージを送信する必要があります。
これがハンドラーです
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);
このアプローチにより、アニメーション アイテムの追加、継続時間の変更、アニメーションのループなど、あらゆる種類のロジックを使用できます。遅延を適切に調整するには、微調整が必要でした。
お役に立てれば。