Почему пауза в javafx.media сразу не приостанавливает проигрывание?
У меня есть программа аудиоплеер. В ней можно менять текущее время мелодии с помощью ползунка slider. Когда ползунок зажат, то проигрывание ставится на паузу, в противном случае (т.е. когда отпускаешь ползунок) проигрывание возобновляется, громкость ставится на 0 и постепенно увеличивается до 1. Проблема состоит в том, что когда я отпускаю ползунок, происходит резкий щелчок (от которого я и хочу избавиться). Я пробовал ставить задержку, однако это не помогло. Я только изучают javafx и скорее всего чего то не понимаю в его особенностях. Буду благодарен за понятный ответ
slider.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> changed, Number oldValue, Number newValue) {
if(slider.isPressed()) {
mediaPlayer.pause(); // изменить время и поставить на паузу
mediaPlayer.setStartTime(Duration.seconds(newValue.intValue()));
}
}
});
slider.setOnMouseClicked(new EventHandler<Event>() {
public void handle(Event event) { // возобновить проигрывание
mediaPlayer.setVolume(0);
mediaPlayer.play();
}
});
protected void smoothPlay(int Sleep) throws InterruptedException { // плавно увеличить громкость после play()
Thread.sleep(Sleep);
mediaPlayer.setVolume(mediaPlayer.getVolume() + 0.0150);
}
Ответы (2 шт):
Необходимо, чтобы цикл с постепенным изменением значения volume
и с Thread.sleep(...)
исполнялся в другом потоке, при этом важно учитывать, что изменять значение volume
допускается только в FXApplicationThread
.
Проще будет использовать возможности из javafx.animation (что немного неинтуитивно) )
final Animation smoothPlay = new Transition() {
{
setCycleDuration(Duration.millis(2000));
}
@Override
protected void interpolate(double frac) {
mediaPlayer.setVolume(frac); // здесь может будет нужен какой-то коэффициент
}
};
mediaPlayer.setVolume(0);
smoothPlay.play();
mediaPlayer.play();
Решил проблему, включив плавное затухание перед паузой. Это скорее всего связано с тем, что пауза в javafx media, включается перед setVolume. Авось кому понадобится