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: 还是有误差的啊 我把代码贴出来您看一下吧
一年多之前 回复
baidu_37299572
baidu_37299572 好的 我试一下
一年多之前 回复
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: 对的 就是这个问题 不好意思没及时回复你 之前就先把这个问题先放了一下 今天才看到
一年多之前 回复
viewgroup
viewgroup 你的意思是你停止的时间是42分15秒,然后下一个打印应该是42分16秒,但是打印结果是42分10秒对吧
一年多之前 回复
viewgroup
viewgroup   2017.01.11 17:23

你在handler里面做了什么?

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

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

baidu_37299572
baidu_37299572 额。。如果不在onStopTrackingTouch里面更改mediaplayer的seekto那点击进度条调成mediaplayer的播放位置要怎么实现呢,,
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Android开发之拖动条(SeekBar)
t拖动条: SeekBar.getProgress()获取拖动条当前值 调用setOnSeekBarChangeListener()方法,处理拖动条值变化事件,把SeekBar.OnSeekBarChangeListener实例作为参数传入 package com.example.seekbar; import android.os.Bundle; import an
读取seekbar的值
[java] view plain copy public class MainActivity extends AppCompatActivity {          private SeekBar seekbar=null;          @Override       protected void onCreate(Bundle savedIns
SeekBar的拖动的事件监听
实现OnSeekBarChangeListener接口,覆写方法 方法调用: 在拖动条的任何地方按下鼠标时先调用onStartTrackingTouch一次,再调用onProgressChanged一次。 以后每拖动一下调用onProgressChanged一次。松开鼠标时调用onStopTrackingTouch一次 //当拖动条发生变化时调用该方法 public void onP
android seekbar滑动条实现平滑滑动并回滚至指定值的整数倍
seekbar默认最大值为100,但当我们需要选择的数值更大时,需制定默认最大值,但现在很多app都实现了滑动条可自由平滑的滑动,但手松开后,自动回滚至最接近的可选数值,下面我们就来介绍一下这种效果的实现方法一、配置文件xml <SeekBar android:id="@+id/sb_quota" android:layout_width="match_parent"
android自定义进度值可拖动的seekbar
最近忙找实习,加上实验室在推新项目,需要学习新知识。所以很长一段时间没去整理了官博客了,github也蛮久没更新,很惭愧。接下来还是要坚持写。今天就简单的写一下我在项目中用到的算自定义seekbar的博客,需求是这样的,seekbar需要显示最左和最右值,进度要跟随进度块移动。看下效果图就明白了。 其实实现起来很简单,主要是思路。自定义控件的话也不难,之前我的博客也有专门介绍,这里就不再多说。
Android读取SeekBar数值方法
public class MainActivity extends AppCompatActivity { private SeekBar seekbar=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt
Android 拖动条SeekBar的简单使用
在Android开发中,拖动条常常用于对系统某种数值的设置,例如播放视频和音量等都会用到拖动条SeekBar。SeekBar和进度条十分相似,只是拖动条可以通过滑动块的位置来标志数值,并且允许用户拖动滑动块来改变值。 1、SeekBar的常见的一些的属性 style=”@android:style/Widget.SeekBar” 指定seekbar的样式 android:max=”200” 指定s
android中SeekBar拖动进度条的使用及事件监听
下面和大家分享一下android中SeekBar拖动进度条的使用,以及事件监听。拖动进度条的事件监听需要实现SeekBar.OnSeekBarChangeListener接口,调用SeekBar的setOnSeekBarChangeListener把该事件监听对象传递进去进行事件监听。事件监听接口中有三个重要的方法: 1、onStartTrackingTouch方法 该方法拖动进度条开始拖动的
Android自定义可长按 可点击不可拖动的SeekBar
项目中遇见一个奇怪的需求 就是SeekBar不可点击 ,可长按 和拉着拖拽点拖动。一开始想着很简单嘛。屏蔽吊点击事件,SeekBar自带长按事件,差不多就搞定了,然而是我太天真啊,SeekBar自带的长按监听是无效的。我通过网上查寻资料 有一些简单的方法实现不可单击的 有实现长按的,然后我根据这些方式自己写了一个 满足需求的自定义控件。现在依次说下吧。 1. 不可点击的SeekBar
SeekBar 实现网络获取图片随thumb滑动,,并位于中间位置
此demo实现了seekbar 滑动效果,图片随thumb 滑动而滑动,位于seekbar中间位置: