JavaFX imageview真实坐标translateX和translateY

时间:2014-05-06 12:19:56

标签: javafx imageview transition coordinate

为什么translateX和translateY在我的场景中位置不好?我开始坐标x = 100 y = 200 in real my real coordinate y = -24.8 ...为什么?我的ImageView是什么时候需要真正的坐标?

    primaryStage.setTitle("Title");
    Group root = new Group();
    Scene scene = new Scene(root, 800, 600, Color.WHITE);

   // border.prefHeightProperty().bind(scene.heightProperty());
    //border.prefWidthProperty().bind(scene.widthProperty());
    Image im = new Image("Images/universe.jpg", 800, 600, true, true);
    ImageView iv = new ImageView(im);

    Image iv1 = new Image("Images/Asteroid.png", 60, 50, false, false);
    ImageView iv2 = new ImageView(iv1);
    iv2.setX(100);
    iv2.setY(200);

    Path p = new Path();
    p.getElements().add(new MoveTo(100, 200));
    p.getElements().add(new LineTo(200, 400));
    PathTransition pt = new PathTransition(Duration.millis(10000), p);
    pt.setNode(iv2);
    root.getChildren().add(iv2);   
    DoubleProperty xValue = new SimpleDoubleProperty();
    xValue.bind(iv2.translateXProperty());
    xValue.addListener(new ChangeListener() {

        @Override
        public void changed(ObservableValue ov, Object t, Object t1) {
         //   System.out.println((double) t1);
        }
    });
       DoubleProperty yValue = new SimpleDoubleProperty();
    yValue.bind(iv2.translateYProperty());
    yValue.addListener(new ChangeListener() {

        @Override
        public void changed(ObservableValue ov, Object t, Object t1) {
            System.out.println((double) t1);
        }
    });
    pt.play();
    primaryStage.setScene(scene);
    primaryStage.show();
}

1 个答案:

答案 0 :(得分:2)

我不知道"真正的坐标"意思是:你想要哪个坐标系(屏幕,场景,父节点,节点......)?

您显示的值是translateY属性;它是垂直平移节点的数量。所以-24.8意味着它从原来的位置移动了24.8个单位。

您可以查看boundsInParent属性,该属性告诉您父坐标系中节点的边界,包括任何变换(例如平移)。 boundsInLocal属性是其自身坐标系中节点的边界,并不包含任何变换。

如果要在场景或屏幕坐标中获取节点的边界,可以使用多种localToScene(...)localToScreen(...)方法中的一种进行转换。

更新:例如,要跟踪场景坐标中图像的边界,您可以执行以下操作:

ChangeListener<Number> listener = new ChangeListener<Number>() {
    @Override
    public void changed(ObservableValue<? extends Number> ov, Number oldValue, Number newValue) {
        Bounds boundsInScene = iv2.localToScene(iv2.getBoundsInLocal());
        double xInScene = boundsInScene.getMinX();
        double yInScene = boundsInScene.getMinY();
        // do something with values...
    }
});
iv2.translateXProperty().addListener(listener);
iv2.translateYProperty().addListener(listener);

阅读Javadocs for Node了解更多详情。