サーフェス ビューと、ビデオをストリーミングするためのメディア プレーヤーがあります。10 秒後に、特定のレイアウトを表示する必要があるとします。そのために、シークバーの進行状況を常に監視し、適切なタイミングでイベントを発生させることができるイベントはありますか?
詳細な説明: 10 分間再生されているビデオがあるとします。10 秒の終わりに、レイアウトがビューに表示されるようにする必要があります。どうすればこれを達成できますか?
サーフェス ビューと、ビデオをストリーミングするためのメディア プレーヤーがあります。10 秒後に、特定のレイアウトを表示する必要があるとします。そのために、シークバーの進行状況を常に監視し、適切なタイミングでイベントを発生させることができるイベントはありますか?
詳細な説明: 10 分間再生されているビデオがあるとします。10 秒の終わりに、レイアウトがビューに表示されるようにする必要があります。どうすればこれを達成できますか?
OnSeekBarChangeListener#OnProgressChange http://developer.android.com/reference/android/widget/SeekBar.OnSeekBarChangeListener.htmlをご覧になることをお勧めします。
もう 1 つの方法は、ビデオの現在の位置を監視する Handler を作成し、現在の位置が 10 秒を超えたときにビューが表示されるように設定することです。その後、ハンドラを停止します。
VideoTimerHandler videoTimerHandler = new VideoTimerHandler();
videoTimerHandler.playVideoTimer();
// Handler that monitor video progress every 1 sec
private class VideoTimerHandler extends Handler {
private static final String TAG = "VideoTimerHandler";
private final int VIDEO_TIMER_PERIOD = 1000;
public void playVideoTimer(){
this.sendEmptyMessage(0);
}
public void stopVideoTimer(){
this.removeMessages(0);
}
public void handleMessage(Message msg){
if (player.getCurrentPosition() > 10){
yourView.setVisibility(View.VISIBLE);
}
else{
// check again after 1 sec
this.sendEmptyMessageDelayed(0, VIDEO_TIMER_PERIOD);
}
}
}
最初の方法
SeekBar に関連付けられた MediaPlayer を使用したくないのはなぜですか? MediaPlayer は onCompletion コールバックを公開します。
OnCompletionListener cListener = new OnCompletionListener(){
public void onCompletion(MediaPlayer mp){
//do something
}
};
mediaPlayer.setOnCompletionListener(cListener);
2番目の方法
Handler's postDelayed
この目的のために関数を使用する必要があります。で指定された遅延でコードを実行するmain UI thread
ため、UI コントロールを更新できます。
private int mInterval = 10*1000; // 10 seconds by default,or calculate it mediaplayer.getDuration(); //it is in milliseconds
private Handler mHandler;
@Override
protected void onCreate(Bundle bundle) {
...
mHandler = new Handler();
}
Runnable mStatusChecker = new Runnable() {
@Override
public void run() {
showDesireLayout(); //change visibility in this function.
//mHandler.postDelayed(mStatusChecker, mInterval); //uncomment it if you want to repeat it after equal intervals of time.
}
};
void startRepeatingTask() {
mStatusChecker.run();
}
void stopRepeatingTask() {
mHandler.removeCallbacks(mStatusChecker);
}
電話するだけstartRepeatingTask();