問題が個別のサウンド間の間隔を制御することである場合、これを行う最も簡単な方法はハンドラーを使用することです。
基本的に、非同期プロセスであるサウンドの再生を開始します。次に、ハンドラーを使用してメッセージをスケジュールし、将来のある時点で次のサウンドを再生します。正しく設定するには試行錯誤が必要ですが、すべてのデバイスで前のサウンドの後に同じ間隔でサウンドが開始されることが保証されます。
ここに、私が話していることを説明するためのコードをいくつか示します。
使用できるハンドラーの実装を次に示します。
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 を変更して、同じサウンドを継続的に再生することもできます。私はこのように書かれており、異なるサウンドを順番に再生できるようになっています。