Переведите с фиксированной скоростью, пока нажата кнопка - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь заставить 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), потому что, когда она зацикливается, изображение вернется назад из своей исходной позиции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...