Я пытаюсь заставить ImageView
двигаться внутри панели, пока нажата клавиша. Поскольку я хочу, чтобы анимация была как можно более плавной, я подумал, что инструмент для анимации JavaFX будет моим лучшим вариантом, но я не могу понять, как правильно контролировать скорость анимации. Это была моя идея:
ImageView image;
TranslateTransition translate;
@Override public void start(Stage primaryStage) throws Exception {
image = new ImageView("file:D:\\test.jpg");
image.setFocusTraversable(true);
AnchorPane pane = new AnchorPane(image);
pane.setOnKeyPressed(event -> translate.play());
pane.setOnKeyReleased(event -> translate.stop());
translate = new TranslateTransition();
translate.setOnFinished(event -> translate.playFromStart());
translate.setDuration(Duration.seconds(1.0));
translate.setByX(20.0);
translate.setNode(image);
primaryStage.setScene(new Scene(pane));
primaryStage.show();
}
Что работает, как я и ожидал, за исключением очень заметной паузы между каждым циклом анимации. Причина, по которой я использовал этот подход, заключалась в том, чтобы иметь возможность контролировать скорость ImageView
, например, постоянную скорость 20 пикселей в секунду.
Казалось бы, более уместно использовать AnimationTimer
, но, насколько я понимаю, этот таймер зависит от частоты кадров, с которой обновляется сцена, которая может варьироваться в зависимости от компьютера, что, в свою очередь, приводит к изменяющейся скорости анимации.
Мой вопрос двоякий. Во-первых, можно ли изменить мой код, чтобы убрать задержку между завершением одного цикла и началом следующего? Во-вторых, какой лучший подход вы можете предложить?
Проблема в том, что я не могу просто зациклить анимацию, используя Animation.setCycleCount(Animation.INDEFINITE)
, потому что, когда она зацикливается, изображение вернется назад из своей исходной позиции.