我正在制作一个自定义视频播放器,我成功地将视频进度同步到了seekbak。我希望当用户移动搜索栏处理程序时,videoview应该将其进度与搜索栏的进度同步。我也实现了这一点,但它并不像我想要的那样表现。让我详细说明这个问题,当我触摸搜索栏处理程序并移动它(向前或向后)时,我更新搜索栏进度,但是当我离开搜索栏时,搜索栏处理程序向前/向后一步然后开始播放而不是从我离开时的同一点。
这是我的代码:
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;
}
}
我不知道为什么会这样,我希望你们能给我一个提示或解决方案。
答案 0 :(得分:10)
我觉得你在这个实用程序类中让自己有点太复杂了。 将搜索栏的最大进度设置为等于视频持续时间。 然后在搜索栏监听器上,您可以直接获得进度并寻求它。 我希望你能理解我输入的内容,这是我的第一个答案:)。
private void playVideo() {
Uri uri = Uri..parse("android.resource://com.sunshine.handsonequation/raw/title_video");
vvVideo.setVideoURI(uri);
vvVideo.start();
// Updating progress bar
updateProgressBar();
}
private void updateProgressBar() {
mHandler.postDelayed(updateTimeTask, 100);
}
private Runnable updateTimeTask = new Runnable() {
public void run() {
sbVideo.setProgress(vvVideo.getCurrentPosition());
sbVideo.setMax(vvVideo.getDuration());
mHandler.postDelayed(this, 100);
}
};
public void onProgressChanged(SeekBar seekbar, int progress,boolean fromTouch) {
}
public void onStartTrackingTouch(SeekBar seekbar) {
mHandler.removeCallbacks(updateTimeTask);
}
public void onStopTrackingTouch(SeekBar seekbar) {
mHandler.removeCallbacks(updateTimeTask);
vvVideo.seekTo(sbVideo.getProgress());
updateProgressBar();
}
答案 1 :(得分:0)
在SeekBar
功能中查看视频onProgressChanged
进度。
@Override
public void onProgressChanged(SeekBar seekbar, int progress,
boolean fromTouch) {
if(fromTouch)
{
vvVideo.seekTo(progress);
}
}
答案 2 :(得分:0)
Nirmal答案应该有效但不是
vvVideo.seekTo(progress);
应该是
vvVideo.seekTo(progress*1000);
seekTo时间应以毫秒为单位
http://developer.android.com/reference/android/widget/VideoView.html#seekTo(int)
答案 3 :(得分:0)
int mSeekValue = (progress * mTotalDurationInMilliSeconds) / 1000 ;
vvVideo.seekTo(mSeekValue);
代替
vvVideo.seekTo(progress*1000);