JAVA FX - анимация по временной шкале (найдите определенную точку x, y во время анимации) - PullRequest
0 голосов
/ 08 февраля 2019

В этой программе я пытаюсь сделать прямоугольник красным, когда x == 600 в цикле for.В основном происходит то, что цикл for работает быстрее, чем анимация на экране.Прямоугольник заканчивает тем, что стал красным, прежде чем он фактически достигнет этой определенной точки на экране JavaFX.

То, что я хотел бы сделать, чтобы оно достигло точки x, y: (600 500), чтобы синий прямоугольник стал красным.

import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 *
 * @author Owner
 */
public class TestPoint extends Application {

    @Override
    public void start(Stage primaryStage) {

        Pane root = new Pane();
        Scene scene = new Scene(root, 1000, 1000);
        Rectangle rect = new Rectangle();
        Rectangle rectTwo = new Rectangle();

        //Obstacle that other square must hit
        rectTwo.setWidth(100);
        rectTwo.setHeight(100);
        rectTwo.setX(500);
        rectTwo.setY(500);
        rectTwo.setFill(Color.PINK);

        //for loop that causes the animation to properly move
        for (int x = 800; x >= 0; x--) {
            rect.setWidth(100);
            rect.setHeight(100);
            rect.setX(800);
            rect.setY(500);
            rect.setFill(Color.BLUE);
            Timeline timeline = new Timeline();
            timeline.setCycleCount(1);
            timeline.setAutoReverse(true);
            final KeyValue kv = new KeyValue(rect.xProperty(), x);
            final KeyFrame kf = new KeyFrame(Duration.seconds(8), kv);
            timeline.getKeyFrames().add(kf);
            timeline.play();
            //if it hits the point of rectTwo, change to Color.RED
            System.out.println(x);
            if (x == 600) {
                rect.setFill(Color.RED);
                break;//end 
            }
        }

        root.getChildren().addAll(rect, rectTwo);
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

1 Ответ

0 голосов
/ 08 февраля 2019

Вы неправильно поняли, как работает Timeline.Ваш код создает 201 Timeline анимации, работающие параллельно.Цикл выполняется до отображения окна .Любые обновления автоматически запускаются JavaFX позже.

Указание исходного состояния и целевого состояния с помощью KeyFrame s является достаточным.KeyFrame s позволяет вам указать обработчик, который будет выполняться в определенное время;это может быть использовано для изменения цвета.В качестве альтернативы обработчик onFinished можно использовать для окраски Rectangle.

rect.setWidth(100);
rect.setHeight(100);
rect.setY(500);
rect.setFill(Color.BLUE);

Timeline timeline = new Timeline(
        new KeyFrame(Duration.ZERO, new KeyValue(rect.xProperty(), 800)),
        new KeyFrame(Duration.seconds(8),
                evt -> rect.setFill(Color.RED),
                new KeyValue(rect.xProperty(), 600)));
timeline.play();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...