JavaFX imageview real coordinates translateX and t

2019-02-21 06:44发布

问题:

And why the translateX and translateY is bad position on my scene ? I start on coordinate x = 100 y = 200 in real my real coordinate y = -24.8 ... why ? I need real coordinates when is my ImageView is ?

    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:

I don't know what "real coordinate" means: which coordinate system are you wanting (screen, scene, parent, node...)?

The value you are displaying is the translateY property; it's the amount by which the node is translated vertically. So -24.8 means it's moved 24.8 units up from its original position.

You can look at the boundsInParent property, which tells you the bounds of the node in the parent's coordinate system, including any transforms (such as the translation). The boundsInLocal property is the bounds of the node in its own coordinate system, and doesn't include any transforms.

If you want to get the bounds of the node in scene or screen coordinates, you can use one of the many localToScene(...) or localToScreen(...) methods to convert.

Update: For example, to track the bounds of the image in scene coordinates, you can do something like:

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);

Read the Javadocs for Node for more details.