Spostamento di forme in JavaFX canvas


Vorrei sapere se è possibile utilizzare GraphicsContext di una tela per creare un cerchio(o qualsiasi forma creata con GraphicsContext) e quindi spostarlo sulla tela. Se lo è, qual è l'algoritmo per farlo? Sono abituato a lavorare con Java e non riesco proprio a capirlo.

Grazie in anticipo per qualsiasi aiuto.

Author: jewelsea, 2014-01-28

1 answers

Fondamentalmente, il modo in cui funziona è che si imposta un Canvas e si aggiorna la posizione della forma in base ad alcuni Timeline. Quindi, in un AnimationTimer dipingi la tua tela.

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); }
}  

È tuttavia più semplice non usare una tela, ma invece usare un riquadro contenente un cerchio in combinazione con un TranslateTransition.

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