У меня есть приложение аудиоплеера, и есть кнопка Play / Pause, связанная с SeekBar. Если mediaPlayer
находится в состоянии воспроизведения, каждое взаимодействие пользователя с полосой хорошо воспринимается, полоса очень отзывчива и правильно связана с длительностью аудиоклипа. Теперь вот проблема ... Если mediaPlayer
поставлен на паузу, каждое взаимодействие пользователя с большим пальцем панели заставляет его сбрасывать свой прогресс до 0%, пока он все еще находится в режиме паузы, когда он должен был оставаться там, где его поставил пользователь. Как только mediaPlayer
возобновляется, оно начинается с того места, куда пользователь указал, когда оно было приостановлено. Таким образом, я явно что-то упускаю, и большой палец бара кажется на 0%, если нажать, когда mediaPlayer
на паузе.
создание 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).
}
}