代码之家  ›  专栏  ›  技术社区  ›  Mark

如何在父坐标系中转换节点?

  •  0
  • Mark  · 技术社区  · 6 年前

    我有一个节点,它是“本地”组的子节点,是“全局”组的子节点。我想在全局组的坐标中转换子对象,但是 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
    

    我还可以使用目标的边界,而不是它的translate属性来找到最终目的地,但是translate对于这个例子来说已经足够了。

    2 回复  |  直到 6 年前
        1
  •  0
  •   fabian    6 年前

    你可以合并 Node.localToScene Node.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());
    
        2
  •  0
  •   Ahmed Emad    6 年前

    你可以 translate 任何使用 setTranslateX() setTranslateY()
    你可以通过获得 Node 你想这样移动

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

    以及目标节点的边界,然后可以使用它们的边界进行转换