我正在制作一个自定义视频播放器,我成功地将视频进度同步到 seekbak。当用户移动搜索栏处理程序时,我希望视频视图应将其进度与搜索栏的进度同步。我也实现了这一点,但它的行为也不是我想要的。让我详细说明一下这个问题,当我触摸 seekbar 处理程序并将其移动(向前或向后)时,我会更新 seekbar 进度,但是当我离开 seekbar 时,seekbar 处理程序会向前/向后移动一步,然后开始播放而不是从我离开的地方。
这是我的代码:
public class MainActivity extends Activity implements OnSeekBarChangeListener {
private VideoView vvVideo;
private SeekBar sbVideo;
private Handler mHandler = new Handler();
private Utilities utils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_video_player);
initOnjects();
playVideo();
}
private void initOnjects() {
vvVideo = (VideoView) findViewById(R.id.vvVideo);
sbVideo = (SeekBar) findViewById(R.id.sbVideo);
sbVideo.setOnSeekBarChangeListener(this);
utils = new Utilities();
}
private void playVideo() {
Uri uri = Uri
.parse("android.resource://com.sunshine.handsonequation/raw/title_video");
vvVideo.setVideoURI(uri);
sbVideo.setProgress(0);
sbVideo.setMax(100);
vvVideo.start();
// Updating progress bar
updateProgressBar();
}
private void updateProgressBar() {
mHandler.postDelayed(updateTimeTask, 100);
}
private Runnable updateTimeTask = new Runnable() {
@Override
public void run() {
long totalDuration = vvVideo.getDuration();
long currentDuration = vvVideo.getCurrentPosition();
// update progress bar
int progress = (int) (utils.getProgressPercentage(currentDuration,
totalDuration));
sbVideo.setProgress(progress);
mHandler.postDelayed(this, 100);
}
};
@Override
public void onProgressChanged(SeekBar seekbar, int progress,
boolean fromTouch) {
// TODO Auto-generated method stub
}
// when user starts moving the progress handler
@Override
public void onStartTrackingTouch(SeekBar seekbar) {
// remove message Handler from updating progress bar
mHandler.removeCallbacks(updateTimeTask);
}
// when user stops moving the progress handler
@Override
public void onStopTrackingTouch(SeekBar seekbar) {
mHandler.removeCallbacks(updateTimeTask);
int totalDuration = vvVideo.getDuration();
int currentPosition = utils.progressToTimer(sbVideo.getProgress(),
totalDuration);
// forward or backward to certain seconds
vvVideo.seekTo(currentPosition);
// update timer progress again
updateProgressBar();
}
}
实用程序类:
public class Utilities {
/**
* Function to convert milliseconds time to
* Timer Format
* Hours:Minutes:Seconds
* */
public String milliSecondsToTimer(long milliseconds){
String finalTimerString = "";
String secondsString = "";
// Convert total duration into time
int hours = (int)( milliseconds / (1000*60*60));
int minutes = (int)(milliseconds % (1000*60*60)) / (1000*60);
int seconds = (int) ((milliseconds % (1000*60*60)) % (1000*60) / 1000);
// Add hours if there
if(hours > 0){
finalTimerString = hours + ":";
}
// Prepending 0 to seconds if it is one digit
if(seconds < 10){
secondsString = "0" + seconds;
}else{
secondsString = "" + seconds;}
finalTimerString = finalTimerString + minutes + ":" + secondsString;
// return timer string
return finalTimerString;
}
/**
* Function to get Progress percentage
* @param currentDuration
* @param totalDuration
* */
public int getProgressPercentage(long currentDuration, long totalDuration){
Double percentage = (double) 0;
long currentSeconds = (int) (currentDuration / 1000);
long totalSeconds = (int) (totalDuration / 1000);
// calculating percentage
percentage =(((double)currentSeconds)/totalSeconds)*100;
// return percentage
return percentage.intValue();
}
/**
* Function to change progress to timer
* @param progress -
* @param totalDuration
* returns current duration in milliseconds
* */
public int progressToTimer(int progress, int totalDuration) {
int currentDuration = 0;
totalDuration = (int) (totalDuration / 1000);
currentDuration = (int) ((((double)progress) / 100) * totalDuration);
// return current duration in milliseconds
return currentDuration * 1000;
}
}
我不知道为什么会这样,我希望你们能给我一个提示或解决方案。