2 baidu 37299572 baidu_37299572 于 2017.01.11 09:59 提问

拖动seekbar后获取的seekbar.getProgress()值有一些误差如何解决

在seekbar的setOnSeekBarChangeListener的onProgressChanged和onStopTrackingTouch中分别 currentProgress_seek = seekbar.getProgress();然后分别使用
int timelong = currentProgress_seek / 1000;
hour_ = timelong / 60 / 60;
minute_ = (timelong / 60) % 60;
second_ = timelong % 60;
并打印Log.e("nowtime", "currenttime:" + hour_ + ":" + minute_ + ":" + second_);和 Log.e("nowtime", "stoptime:" + hour_ + ":" + minute_ + ":" + second_);
得到当前播放到的时间,当拖动进度条以后先打印currenttime然后stoptime然后进度条继续更新再打印currenttime,但是发现打印stoptime以后下一次的currenttime的值和stoptime有误差,想请问一下这是怎么回事?如何解决?

4个回答

viewgroup
viewgroup   2017.01.11 11:19

timelong不要使用int啊。。使用double下面的一样,然后你在看一下

baidu_37299572
baidu_37299572 回复baidu_37299572: 还是有误差的啊 我把代码贴出来您看一下吧
11 个月之前 回复
baidu_37299572
baidu_37299572 好的 我试一下
11 个月之前 回复
baidu_37299572
baidu_37299572   2017.01.11 12:02

private void setSeerBar() {
mMax = mediaPlayer.getDuration();
seekbar.setMax(mMax);
seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(final SeekBar seekBar, int progress, boolean fromUser) {

            currentProgress_seek = seekbar.getProgress();

            currentProgress_media = mediaPlayer.getCurrentPosition();



            long timelong = currentProgress_seek / 1000;
            hour_ = timelong / 60 / 60;
            minute_ = (timelong / 60) % 60;
            second_ = timelong % 60;
            Log.e("nowtime", "currenttime:" + hour_ + ":" + minute_ + ":" + second_);


        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {


        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            if (mediaPlayer != null) {
                mMax = mediaPlayer.getDuration();
                mediaPlayer.seekTo(currentProgress_seek);
                currentProgress_media = mediaPlayer.getCurrentPosition();
                currentProgress_seek = seekbar.getProgress();
                long timelong = currentProgress_media / 1000;
                hour_ = timelong / 60 / 60;
                minute_ = (timelong / 60) % 60;
                second_ = timelong % 60;
                Log.e("nowtime", "stoptime:" + hour_ + ":" + minute_ + ":" + second_);
                Log.e("SeekBarState", "stopprovess" + seekbar.getProgress());
                Message message = new Message();
                handler.sendEmptyMessage(message.what);
            }

        }
    });
}

然后打印出来的结果是: currenttime:0:49:14
01-11 11:55:54.687 10778-10778/com.example.bmvod.film E/nowtime: currenttime:0:49:15
01-11 11:55:55.691 10778-10778/com.example.bmvod.film E/nowtime: currenttime:0:49:16
01-11 11:55:56.120 10778-10778/com.example.bmvod.film E/nowtime: currenttime:0:42:15
01-11 11:55:56.213 10778-10778/com.example.bmvod.film E/nowtime: stoptime:0:42:15
01-11 11:55:56.688 10778-10778/com.example.bmvod.film E/nowtime: currenttime:0:42:10
01-11 11:55:57.688 10778-10778/com.example.bmvod.film E/nowtime: currenttime:0:42:11
01-11 11:55:58.687 10778-10778/com.example.bmvod.film E/nowtime: currenttime:0:42:12
01-11 11:55:59.689 10778-10778/com.example.bmvod.film E/nowtime: currenttime:0:42:13
这样的,,

baidu_37299572
baidu_37299572 回复viewgroup: 对的 就是这个问题 不好意思没及时回复你 之前就先把这个问题先放了一下 今天才看到
11 个月之前 回复
viewgroup
viewgroup 你的意思是你停止的时间是42分15秒,然后下一个打印应该是42分16秒,但是打印结果是42分10秒对吧
11 个月之前 回复
viewgroup
viewgroup   2017.01.11 17:23

你在handler里面做了什么?

baidu_37299572
baidu_37299572 handler里面就是一个更新的方法 开始破防的时候就有一个线程一直发消息 currentProgress_media = mediaPlayer.getCurrentPosition(); seekbar.setProgress(currentProgress_media);
11 个月之前 回复
viewgroup
viewgroup   2017.01.11 17:46

而且如果你的seekbar和mediaplayer链接到了一起,那么你就不要在onStopTrackingTouch里面更改mediaplayer的seekto,这样又会执行onprogresschange,循环往复。。

baidu_37299572
baidu_37299572 额。。如果不在onStopTrackingTouch里面更改mediaplayer的seekto那点击进度条调成mediaplayer的播放位置要怎么实现呢,,
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!