javafx - 当对象穿过路径时,对路径进行动画处理的最简单方法是什么?

标签 javafx javafx-8

考虑一个穿过长线性路径的矩形。弄清楚形状在动画早期的位置会很有用。在形状移动之前显示整个路径不是我想要的。通过将路径添加到 Pane 中可以轻松完成此操作。

我想要在形状后面有一条尾线,代表该形状到目前为止所经过的路径。有谁知道如何在 Javafx 中做到这一点?我正在使用 Path 和 PathTransition 沿着路径为我的对象设置动画。

最佳答案

有多种解决方案。根据您的选择决定您的结果。

当节点沿着路径移动时,您可以使用 Canvas 并在其上绘制线条。

import javafx.animation.Animation;
import javafx.animation.PathTransition;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.CubicCurveTo;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.stage.Stage;
import javafx.util.Duration;

public class PathVisualization extends Application {

    private static double SCENE_WIDTH = 400;
    private static double SCENE_HEIGHT = 260;

    Canvas canvas;

    @Override
    public void start(Stage primaryStage) throws Exception {

        Pane root = new Pane();
        Path path = createPath();
        canvas = new Canvas(SCENE_WIDTH,SCENE_HEIGHT);

        root.getChildren().addAll(path, canvas);

        primaryStage.setScene(new Scene(root, SCENE_WIDTH, SCENE_HEIGHT));
        primaryStage.show();

        Animation animation = createPathAnimation(path, Duration.seconds(5));
        animation.play();
    }

    private Path createPath() {

        Path path = new Path();

        path.setStroke(Color.RED);
        path.setStrokeWidth(10);

        path.getElements().addAll(new MoveTo(20, 20), new CubicCurveTo(380, 0, 380, 120, 200, 120), new CubicCurveTo(0, 120, 0, 240, 380, 240), new LineTo(20,20));

        return path;
    }

    private Animation createPathAnimation(Path path, Duration duration) {

        GraphicsContext gc = canvas.getGraphicsContext2D();

        // move a node along a path. we want its position
        Circle pen = new Circle(0, 0, 4);

        // create path transition
        PathTransition pathTransition = new PathTransition( duration, path, pen);
        pathTransition.currentTimeProperty().addListener( new ChangeListener<Duration>() {

            Location oldLocation = null;

            /**
             * Draw a line from the old location to the new location
             */
            @Override
            public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {

                // skip starting at 0/0
                if( oldValue == Duration.ZERO)
                    return;

                // get current location
                double x = pen.getTranslateX();
                double y = pen.getTranslateY();

                // initialize the location
                if( oldLocation == null) {
                    oldLocation = new Location();
                    oldLocation.x = x;
                    oldLocation.y = y;
                    return;
                }

                // draw line
                gc.setStroke(Color.BLUE);
                gc.setFill(Color.YELLOW);
                gc.setLineWidth(4);
                gc.strokeLine(oldLocation.x, oldLocation.y, x, y);

                // update old location with current one
                oldLocation.x = x;
                oldLocation.y = y;
            }
        });

        return pathTransition;
    }

    public static class Location {
        double x;
        double y;
    }

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

这是它的屏幕截图。红色是实际路径,蓝色是在 Canvas 上绘制的路径:

enter image description here

其他解决方案使用 e。 G。 a clip 。但是,如果您使用该技术选择与我上面相同的持续时间(即 5 秒),您将得到如下间隙:

enter image description here

使用线条绘制的解决方案也有其缺点。如果选择 1 秒,您将看到线段。规避此问题的一种可能性是 smooth the path你自己。但为此,您必须将路径分成几段,这有点数学化。

有点离题,但是如何paint along the mouse coordinates您可能也有兴趣为您提供想法。

关于javafx - 当对象穿过路径时,对路径进行动画处理的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29302120/

相关文章:

java - JavaFX 中的三次方程图。

java - 在 JavaFX 构建中添加外部 jar 文件

tableview - 如何防止 TableView 在 javaFX 8 中对 TableColumn 进行重新排序?

java - 如何在 javafx 中使用 Canvas 和文本

javafx-2 - java.lang.IllegalArgumentException : Invalid URL or resource not found

JavaFX占用内存并不断增加?

listview - JavaFX 2 中的多列(包装)ListView

java - 将值从 javascript 传递到 JavaFX

javafx - 文本区域滚动 Pane 保留在文本附加中

JavaFx:TitledPane 折叠后滚动重置