【问题标题】:JavaFx - Circle path animation and ScrollEventJavaFx - 圆形路径动画和 ScrollEvent
【发布时间】:2016-03-28 00:37:00
【问题描述】:

对于圆形路径动画,我从这个链接复制了代码 JavaFX 2 circle path for animation,

但我需要此代码来执行以下操作:

  1. 我想用我的 MouseWheel 移动绿色矩形,我不确定这是否以及如何与 ScrollEvent 一起使用。

  2. 使用“添加矩形”按钮,我想在此圆形路径中添加一些矩形

任何帮助将不胜感激

【问题讨论】:

  • 尝试在onScroll 处理程序中结合使用getCurrentTime() 和jumpTo(...) 来操纵动画的当前时间。
  • 感谢您的快速回答。我会尝试你提到的组合,看看我是否可以实现它。

标签: java animation scroll javafx eventhandler


【解决方案1】:

我其实忘了回答这个问题,所以这里是:

public void start(Stage primaryStage) throws Exception {

    // Choose a Object to move around the Path
    Circle objectCircle = new Circle();
           objectCircle.setRadius(10);

    // Use a Shape for the Path or...
    Circle pathCircle = new Circle(300, 200, 150);
           pathCircle.setFill(null);
           pathCircle.setStroke(Color.BLACK);

    // ...use different approach (see createEllipsePath below) or...
    Path path = createEllipsePath(400, 200, 150, 150, 0);

    // ...use Class MoveTo & CubicCurveTo
    //path.getElements().add (new MoveTo (0f, 50f));
    //path.getElements().add(new CubicCurveTo(40f, 10f, 390f, 240f, 1904, 50f));

    // Set up a Path Transition
    PathTransition pathTransitionCircle = new PathTransition();
                   pathTransitionCircle.setDuration(Duration.seconds(10));
                   pathTransitionCircle.setNode(objectCircle);
                   pathTransitionCircle.setPath(pathCircle);
                   pathTransitionCircle.setCycleCount(Timeline.INDEFINITE);
                   pathTransitionCircle.setAutoReverse(false);
                   pathTransitionCircle.setInterpolator(Interpolator.LINEAR);
                   pathTransitionCircle.play();

    BorderPane root = new BorderPane();
               root.getChildren().addAll(pathCircle,objectCircle);

    // Pause Transition
    root.setOnMousePressed(eve -> pathTransitionCircle.pause());

    // Set up the ScrollEvent
    root.setOnScroll(event -> {

        //SCROLL UP
        double currentTime = pathTransitionCircle.getCurrentTime().toMillis();
        double jumpRate = 100; // change rate for smaller/bigger jumps
        pathTransitionCircle.jumpTo(Duration.millis(currentTime + jumpRate));

        //SCROLL DOWN
        double deltaY = event.getDeltaY();
        if (deltaY < 0) {
            if (currentTime == 0) {
                currentTime = 10000; // end of circle is 10000millis: at second 0 we cannot jump to negative seconds, so we set it to 10000millis
                pathTransitionCircle.jumpTo(Duration.millis(currentTime - jumpRate));
            } else {
                pathTransitionCircle.jumpTo(Duration.millis(currentTime - jumpRate));
            }
        }
    });

    primaryStage.setTitle("Path Transition ScrollEvent");
    primaryStage.setScene(new Scene(root, 600, 400));
    primaryStage.show();
}

//create an EllipsePath with ArcTo
private Path createEllipsePath(double centerX, double centerY, double radiusX, double radiusY, double rotate) {

    ArcTo arcTo = new ArcTo();
          arcTo.setX(centerX - radiusX + 1); // to simulate a full 360 degree circle
          arcTo.setY(centerY - radiusY);
          arcTo.setSweepFlag(false);
          arcTo.setLargeArcFlag(true);
          arcTo.setRadiusX(radiusX);
          arcTo.setRadiusY(radiusY);
          arcTo.setXAxisRotation(rotate);

    Path pathCircle = new Path();
         pathCircle.getElements().addAll(new MoveTo(centerX - radiusX, centerY - radiusY),arcTo);
         pathCircle.getElements().add(new ClosePath());

    // Styling
         pathCircle.setStroke(Color.RED);
         pathCircle.getStrokeDashArray().setAll(5d, 5d);

    return pathCircle;
}

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

}

【讨论】:

    猜你喜欢
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    相关资源
    最近更新 更多