【问题标题】:Moving shapes in JavaFX canvas在 JavaFX 画布中移动形状
【发布时间】:2014-02-19 04:31:28
【问题描述】:

我想知道是否可以使用 Canvas 的 GraphicsContext 创建一个圆圈(或使用 GraphicsContext 创建的任何形状),然后在画布上移动它。如果是,这样做的算法是什么?我习惯于使用 Java,但我就是想不通。

提前感谢您的帮助。

【问题讨论】:

  • 嗨。欢迎来到堆栈溢出。到目前为止你有什么尝试? - 如果你展示一些代码,你更有可能得到积极的回应。

标签: animation canvas javafx


【解决方案1】:

基本上,它的工作方式是设置一个Canvas 并根据一些Timeline 更新形状的位置。然后,在 AnimationTimer 中绘制画布。

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

不过,不使用 Canvas 会更简单,而是使用包含 CirclePaneTranslateTransition 的组合。

【讨论】:

  • 你是个传奇!非常感谢,我花了很多时间在谷歌上搜索,但找不到任何东西。您对 Pane and Circle 解决方案更简单也是正确的,想法是在 Java 中执行此操作,然后我认为使用 JavaFX 几乎相同(不是我最聪明的想法之一)再次感谢!
  • 我正在为本身位于窗格内部的窗格上设置形状节点的动画,但我无法理解坐标系相对于父窗格的工作方式。我现在正在尝试在 Canvas 上绘制动画形状。由于我需要许多形状,Canvas 似乎更适合性能。
  • @burntsuger,这与原始问题有些无关,但您可能对JavaFX performance 和一些Tips and Tricks 感兴趣。 Oracle benchmarked JavaFX performance 和 canvas 可能比节点慢(第 41-52 页)。每个应用程序的性能都是特定于应用程序的,因此您可能希望在两者上对您的应用程序进行基准测试。
猜你喜欢
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
相关资源
最近更新 更多