5

我正在制作一个自定义视频播放器,我成功地将视频进度同步到 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;
    }
}

我不知道为什么会这样,我希望你们能给我一个提示或解决方案。

4

4 回答 4

15

我认为你对那个实用程序类有点太复杂了。将搜索栏的最大进度设置为等于视频持续时间。然后在 seekbar 侦听器上,您可以直接获取它的进度并寻找它。我希望你能明白我在下面输入的内容,这是我的第一个答案:)。

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();
}
于 2014-09-04T14:39:14.717 回答
1

Nirmal answer应该有效,但不是

vvVideo.seekTo(progress); 

它应该是

vvVideo.seekTo(progress*1000);

seekTo 时间应该以毫秒为单位

http://developer.android.com/reference/android/widget/VideoView.html#seekTo(int)

于 2013-12-12T14:19:17.900 回答
1

求视频功能SeekBar进步onProgressChanged

@Override
    public void onProgressChanged(SeekBar seekbar, int progress,
            boolean fromTouch) {
    if(fromTouch)
    {
        vvVideo.seekTo(progress);
    }

    }
于 2013-07-26T13:50:55.207 回答
1
int mSeekValue = (progress * mTotalDurationInMilliSeconds) / 1000 ;
vvVideo.seekTo(mSeekValue);

代替

vvVideo.seekTo(progress*1000);
于 2020-05-14T11:15:14.573 回答