如何在父母的坐标系中平移节点?

时间:2018-08-21 12:50:47

标签: java animation javafx

我有一个节点,该节点是“本地”组的子级,而该节点是“全局”组的子级。我想在全局组的坐标中平移子级,但是TranslateTransition在局部组坐标中移动子级。

在此示例中,我具有以下父级层次结构:

parent group
|- red circle
|- child group
  |- blue circle

我想让蓝色圆圈位于红色圆圈上方。如果我将其转换为红色圆圈的坐标,则它会远离它,因为它在自己的组中。如果我翻译整个小组,那就行了。

import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class AnimTest extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Circle c = new Circle(5, Color.BLUE);
        Group group = new Group(c);
        group.setTranslateX(40);
        group.setTranslateY(50);

        Circle target = new Circle(10, Color.RED);
        target.setTranslateX(20);
        target.setTranslateY(20);

        Group parent = new Group(target, group);

        TranslateTransition t1 = new TranslateTransition(Duration.seconds(1), c); // 'group' works
        t1.setToX(target.getTranslateX());
        t1.setToY(target.getTranslateY());

        Button next = new Button("Play");
        next.setOnAction(e -> t1.play());

        Pane p = new Pane(parent);
        p.setPrefSize(200, 200);
        VBox root = new VBox(p, next);
        stage.setScene(new Scene(root));
        stage.show();
    }

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

如何在红色圆圈的父级坐标中转换蓝色圆圈?

请理解,这是一个简单的示例。实际上,层次结构更大,看起来像

parent group
|- target node
|- group1
  |- group2
    |- group3
      |- moving node

我也可以使用目标的边界而不是它的翻译属性来找到最终的目的地,但对于示例而言,翻译就足够了。

2 个答案:

答案 0 :(得分:0)

您可以使用translatesetTranslateX() setTranslateY()的任何节点,问题是如何知道每个方向的平移量
您可以通过确定要移动的Node的边界来做到这一点

Bounds nodeBounds = node.localToScreen(node.getBoundInLocal());

以及目标节点的边界,然后您可以使用其边界进行翻译 我希望这会有所帮助

答案 1 :(得分:0)

您可以结合使用Node.localToSceneNode.sceneToLocal在同一场景中的坐标系之间进行转换(假设转换是可逆的,并且不按0或类似的比例缩放)。

private static Point2D convertCoordinater(Node source, Node target, double x, double y) {
    Point2D sceneCoords = source.localToScene(x, y);
    return target.sceneToLocal(sceneCoords);
}
Point2D targetCoordinates = convertCoordinater(parent, group, target.getTranslateX(), target.getTranslateY());
t1.setToX(targetCoordinates.getX());
t1.setToY(targetCoordinates.getY());