Déplacement de formes dans JavaFX canvas


Je voudrais savoir s'il est possible d'utiliser GraphicsContext d'un Canevas pour créer un cercle(ou toute forme créée avec GraphicsContext), puis de le déplacer sur le canevas. Si c'est le cas, quel est l'algorithme pour le faire? Je suis habitué à travailler avec Java et je ne peux tout simplement pas le comprendre.

Merci d'avance pour toute aide.

Author: jewelsea, 2014-01-28

1 answers

Fondamentalement, la façon dont cela fonctionne est que vous configurez un Canvas et mettez à jour l'emplacement de la forme en fonction de certains Timeline . Ensuite, dans un AnimationTimer vous peignez votre toile.

circlefun

import javafx.animation.*;
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.scene.*;
import javafx.scene.canvas.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;

public class AnimatedCircleOnCanvas extends Application {
    public static final double W = 200; // canvas dimensions.
    public static final double H = 200;

    public static final double D = 20;  // diameter.

    @Override public void start(Stage stage) {
        DoubleProperty x  = new SimpleDoubleProperty();
        DoubleProperty y  = new SimpleDoubleProperty();

        Timeline timeline = new Timeline(
            new KeyFrame(Duration.seconds(0),
                    new KeyValue(x, 0),
                    new KeyValue(y, 0)
            ),
            new KeyFrame(Duration.seconds(3),
                    new KeyValue(x, W - D),
                    new KeyValue(y, H - D)
            )
        );
        timeline.setAutoReverse(true);
        timeline.setCycleCount(Timeline.INDEFINITE);

        final Canvas canvas = new Canvas(W, H);
        AnimationTimer timer = new AnimationTimer() {
            @Override
            public void handle(long now) {
                GraphicsContext gc = canvas.getGraphicsContext2D();
                gc.setFill(Color.CORNSILK);
                gc.fillRect(0, 0, W, H);
                gc.setFill(Color.FORESTGREEN);
                gc.fillOval(
                    x.doubleValue(),
                    y.doubleValue(),
                    D,
                    D
                );
            }
        };

        stage.setScene(
            new Scene(
                new Group(
                    canvas
                )
            )
        );
        stage.show();

        timer.start();
        timeline.play();
    }

    public static void main(String[] args) { launch(args); }
}  

, Il est cependant plus simple de ne pas utiliser une Toile, mais au lieu d'utiliser un Volet contenant un Cercle, en combinaison avec un TranslateTransition.

 28
Author: jewelsea, 2014-01-28 07:15:00