如何在Android中使用SeekBar同时作为SeekBar和ProgressBar?

10

我打算为我的应用编写一个自定义媒体控制器。我计划使用SeekBar来实现拖动和显示进度。正在尝试实现此功能。

请问是否有类似的实现,或者我走错了方向?

2个回答

23

终于想通了!!

我想出的解决方案是这样的:

首先将seekbar的最大进度设置为视频的持续时间

videoView.setOnPreparedListener(new OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mp) {

            seekBar.setMax(videoView.getDuration());
            seekBar.postDelayed(onEverySecond, 1000);
        }
    });

这段可运行代码将不断更新进度条:

private Runnable onEverySecond=new Runnable() {

    @Override
    public void run() {

        if(seekBar != null) {
            seekBar.setProgress(videoView.getCurrentPosition());
        }

        if(videoView.isPlaying()) {
            seekBar.postDelayed(onEverySecond, 1000);
        }

    }
};

然后可以使用SeekBar的setOnSeekBarChangeListener来获取用户在媒体上的拖动。通过使用fromUser布尔值,我们可以确定它是由于用户交互引起的回调还是由程序自身引起的。

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {

            if(fromUser) {
                // this is when actually seekbar has been seeked to a new position
                videoView.seekTo(progress);
            }
        }
    });

太好了!但当视频播放到结尾,我想再次使用videoView.start()播放时,进度条不起作用了,如何解决这个问题? - java acm

0

你设置了次要进度

不,你走在正确的轨道上。它非常适合显示下载进度和流媒体的当前位置等内容。


感谢回复。但我正在使用次要进度来显示流传输量。 以下是我想出的内容。 - Prasad Korhale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接