当MediaPlayer暂停并手动处理时,SeekBar不会移动

时间:2019-06-17 19:41:46

标签: java android android-seekbar

我有一个音频播放器应用程序,并且有一个链接到SeekBar的“播放/暂停”按钮。如果mediaPlayer处于播放状态,则与条形图的每个用户交互都将得到很好的接收,该条形将非常敏感,并正确链接到音频剪辑的持续时间。现在这是问题所在...如果mediaPlayer被暂停,则用户每次与竖条交互时都会将其进度重置为0%,同时仍要暂停(此时它应该停留在用户放置的位置)。恢复mediaPlayer后,它将从用户暂停时指向的位置开始。因此,我显然缺少了一些东西,如果在mediaPlayer暂停时轻按,则竖线拇指似乎处于0%。

seekBar创建:

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    //Detecting seekBar's movement.
    @Override
    public void onProgressChanged(SeekBar bar, int progress, boolean fromUser) {
        if (fromUser) {
            if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                mediaPlayer.seekTo(progress); //Procedural link of mediaPlayer and seekBar.
            } else {
                seekBar.setProgress(0); //Dictates that seekBar is unusable whenever mediaPlayer is inoperable.
            }
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar bar) {}

    @Override
    public void onStopTrackingTouch(SeekBar bar) {}
});

播放/暂停按钮:

private void usePlayBtn() {
    //Called when playBtn is pressed.
    if(mediaPlayer != null) {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
            playBtn.setImageResource(R.drawable.play);

            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                //Detects mediaPlayer's task completion.
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    completion();
                }
            });
        } else {
            mediaPlayer.start();
            playBtn.setImageResource(R.drawable.pause);
            changeSeekBar();
        }
    }
}

changeSeekBar方法:

private void changeSeekBar() {
    //Changes seekBar's progress in correspondence to mediaPlayer's progress.
    seekBar.setProgress(mediaPlayer.getCurrentPosition());

    if (mediaPlayer.isPlaying()) {
        runnable = new Runnable() {
            @Override
            public void run() {
                changeSeekBar();
            }
        };
        handler.postDelayed(runnable, 10); //Controls the flow of the SeekBar's movement (fewer ms means that the SeekBar's progress refreshes faster, motion appears smoother).
    }
}

0 个答案:

没有答案