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.
12
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.
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