使用onStopTrackingTouch将视频视图与SeekBar同步 [英] Syncing Video View with SeekBar with onStopTrackingTouch

查看:143
本文介绍了使用onStopTrackingTouch将视频视图与SeekBar同步的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作自定义视频播放器,已成功将视频进度同步到seekbak.我希望当用户移动搜索栏处理程序时,视频视图应将其进度与搜索栏的进度同步.我也实现了这一点,但它的行为也不像我想要的那样.让我详细说明一下这个问题,当我触摸搜索栏处理程序并将其(向前或向后)移动时,我会更新搜索栏进度,但是当我离开搜索栏时,搜索栏处理程序会向前/向后前进一步,然后开始播放而不是从开始播放我离开的同一点.

I am making a custom Video Player, I successfully synced the progress of video to the seekbak. I wanted that the videoview should sync its progress with seekbar's progress when user moves the seekbar handler. I achieved this too, but it's not behaving as i want it too. Let me elaborate this proble, When i touch the seekbar handler and move it (forward or backward) i update the seekbar progress, but when i leave the seekbar, the seekbar handler goes a step forward/backward and then starts playing instead of starting at the same point where i left.

这是我的代码:

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;
    }
}

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

I have no clue why it is happening, I hope you guys can give me a hint or solution around this.

推荐答案

我认为您使用该实用工具类会使自己过于复杂. 将搜索栏的最大进度设置为等于视频时长. 然后,在seekbar侦听器上,您可以直接获取它的进度并进行搜索. 希望您能理解我键入的波纹管,这是我的第一个答案:).

I think you complicated yourself a bit too much with that utility class. Set the maximum progress of the seekbar to be equal to the videos duration. Then on the seekbar listener you can just directly get its progress and seek to it. I hope you can understand what I typed bellow , this is my first answer :) .

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();
}

这篇关于使用onStopTrackingTouch将视频视图与SeekBar同步的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆