这是播放媒体时更新ProgressBar的正确方法吗?我想在MediaPlayer中会有一个回调,但我找不到它.
mediaPlayer.start();
final SeekBar progress = (SeekBar) dialog.findViewById(R.id.seekBar1);
progress.setMax(mediaPlayer.getDuration());
new CountDownTimer(mediaPlayer.getDuration(), 250) {
public void onTick(long millisUntilFinished) {
progress.setProgress(progress.getProgress() + 250);
}
public void onFinish() {}
}.start();
Run Code Online (Sandbox Code Playgroud)
最好的祝福.
JRa*_*ond 22
就个人而言,我开始一个getCurrentPosition()每200ms左右检查一次的线程,直到onCompletion()事件被触发:
private class MediaObserver implements Runnable {
private AtomicBoolean stop = new AtomicBoolean(false);
public void stop() {
stop.set(true);
}
@Override
public void run() {
while (!stop.get()) {
progress.setProgress(mediaPlayer.getCurrentPosition());
Thread.sleep(200);
}
}
}
private MediaObserver observer = null;
public void runMedia() {
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener{
@Override
public void onCompletion(MediaPlayer mPlayer) {
observer.stop();
progress.setProgress(mPlayer.getCurrentPosition());
}
});
observer = new MediaObserver();
mediaPlayer.start();
new Thread(observer).start();
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*tai 11
看看android.widget.MediaController,它有一个进度条.
它们使用一个处理程序,如果合适的话递归调用它自己.您可以将延迟设置为您希望更新进度条的频率.
请注意,控制器可以显示或隐藏,也可以由用户拖动,当然 - 视频可以停止.这些是!mDragging && mShowing && mVideoView.isPlaying()在另一个递归调用更新条之前进行各种检查()的原因.
protected Handler mHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
int pos;
switch (msg.what)
{
// ...
case SHOW_PROGRESS:
pos = setProgress();
if (!mDragging && mShowing && mVideoView.isPlaying())
{
msg = obtainMessage(SHOW_PROGRESS);
sendMessageDelayed(msg, 1000 - (pos % 1000));
}
break;
// ...
}
}
};
Run Code Online (Sandbox Code Playgroud)
开始使用:
mHandler.sendEmptyMessage(SHOW_PROGRESS);
Run Code Online (Sandbox Code Playgroud)
它将自行停止,但您应该使用以下命令取消上一个待处理的请求:
mHandler.removeMessages(SHOW_PROGRESS);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25931 次 |
| 最近记录: |