2010-11-30 8 views
6

サウンドの再生が終了したかどうかを確認するにはどうすればよいですか?アンドロイドでサウンドの再生が終了したかどうかを確認するにはどうすればよいですか?

2つのサウンドを再生したいですが、1つのサウンドを再生して、2番目のサウンドが開始されるまで待ってから2番目のサウンドが始まるまで待ちます。

また、私がショーフリッパーで次のビューを表示するようにサウンドが終了したら、何か他のことをしたいと思ったら、それはできますか?

今はSoundPoolを使用してサウンドを再生しています。

答えて

3

MediaPlayerクラスとOnCompletionListener

+3

SoundPoolでこれを行う方法はありませんか?私は、SoundPoolのレイテンシが低いことが必要です。 – cmerrell

+0

Dahlgrenと合意MediaPlayerは道のりです。準備が整った後で、ready()を使ってサウンドをあらかじめ準備しておくことができます。 – Darrell

+0

MediaPlayerを使用して20以上のサウンドを読み込むことはできますか、または20以上のMediaPlayerのインスタンスが必要ですか。 – cmerrell

0

ジャストアイデア... GET OGG/WAVの音声再生時間の長さを使用して、タイマー部材と、独自のSoundObjectクラスを使用します。 更新機能で更新します。 timer> maxtime + thresholdの場合は、終了としてフラグを付けます。

0

私がこれを解決する方法は、イメージ、サウンド、および遅延を含むアニメーションシーケンスを作成することです。私はこれらをキューに入れて、画像を表示し、それに伴って音を出し、別の画像に切り替えることができます。私は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); 

私は、アニメーションアイテム、変更期間、ループアニメーションなどを追加するためのロジックのすべての種類を持つことができます...それはちょうど遅延が権利を取得するために、いくつかの微調整をしました。

これが役に立ちます。

0

申し訳ありませんが、これは返信が遅すぎます。しかし、メディアプレイヤーのisPlaying()APIを使用して、最初の曲が完成するのを待っていました。

while(mediaPlyaer.isPlaying()){ 
} 
関連する問題