我有一个表面视图和一个媒体播放器来流式传输视频。说 10 秒后,我需要使特定的布局可见。为此,是否有任何事件可以持续监控搜索栏的进度并在适当的时间触发事件?
详细解释:假设我有一个 10 分钟的视频正在播放。在第 10 秒结束时,布局应该在视图中可见。我如何实现这一目标?
我有一个表面视图和一个媒体播放器来流式传输视频。说 10 秒后,我需要使特定的布局可见。为此,是否有任何事件可以持续监控搜索栏的进度并在适当的时间触发事件?
详细解释:假设我有一个 10 分钟的视频正在播放。在第 10 秒结束时,布局应该在视图中可见。我如何实现这一目标?
我建议你看看 OnSeekBarChangeListener#OnProgressChange http://developer.android.com/reference/android/widget/SeekBar.OnSeekBarChangeListener.html
另一种方法是编写一个处理程序来监视视频的当前位置,然后将视图设置为在当前位置超过 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);
第二种方法
您应该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();