如何缩放和设置MediaView的坐标?

我想在我的JavaFx 2.x场景中嵌入一个video,并调整它的大小并将其重新定位到我的需要。 我遇到的问题是跟随。 如果我构建一个MediaView组件,然后转换X或Y坐标,那么整个视图正在正确移动,如下所示:

 MediaView mv = (...) mv.setTranslateX(200); mv.setTranslateY(200); 

我可以使用缩放属性进行类似的转换:

 MediaView mv = (...) mv.setScaleX(2); mv.setScaleY(2); 

这将在尺寸上适当地缩放 mv实例两次。

但是,问题在于我将这两种翻译结合起来。 mv实例正在缩放,但它总是以屏幕坐标(0,0) 。 从我的角度来看,这当然是不正确的行为。

我还尝试将MediaView组件包装在某个包装器节点中,例如Group并对此元素执行翻译。 行为是一样的。

如何同时正确移动和缩放MediaView组件?

编辑:

这是我的代码,虽然我在这里使用ImageView 。 然而,这是无关紧要的。 运行此代码后,图像将放在(0,0)而不是(100,100)

  @Override public void start(Stage stage) throws Exception { Group root = new Group(); // Img's dimension is 200x200 javafx.scene.image.Image img = new javafx.scene.image.Image("/home/bachman/projects/cs-player/src/main/resources/content.png"); ImageView iv = new ImageView(img); root.getChildren().add(iv); // Move Image View iv.setTranslateX(100); iv.setTranslateY(100); // Scale Image View iv.setScaleX(2.0); iv.setScaleY(2.0); Scene scene = new Scene(root); stage.setWidth(600); stage.setHeight(600); stage.setScene(scene); stage.show(); } 

当您使用setScaleX,setScaleY时,缩放从节点的中心发生。

如果除了缩放之外还想要转换金额,则需要在设置所需的转换值时考虑扩展扩展。 例如,如果节点的大小加倍(并且您希望将节点转换为相对于未缩放节点左上角的位置),则需要将节点宽度和高度的另一半转换。

 import javafx.application.Application; import javafx.scene.*; import javafx.scene.media.*; import javafx.scene.transform.*; import javafx.stage.Stage; public class TransformedVideo extends Application { public static void main(String[] args) throws Exception { launch(args); } @Override public void start(final Stage stage) throws Exception { final MediaPlayer oracleVid = new MediaPlayer(new Media("http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv")); final MediaView mediaView = new MediaView(oracleVid); mediaView.setFitWidth(320); mediaView.setFitHeight(240); mediaView.setPreserveRatio(false); mediaView.setTranslateX(mediaView.getFitWidth() / 2 + 200); mediaView.setTranslateY(mediaView.getFitHeight() / 2 + 200); mediaView.setScaleX(2); mediaView.setScaleY(2); // alternative method of scaling and translating. // mediaView.getTransforms().addAll( // new Translate(200, 200), // new Scale(2, 2) // ); Group group = new Group(mediaView); stage.setScene(new Scene(group, 1250, 800)); stage.show(); oracleVid.play(); System.out.println(group.getBoundsInParent()); } } 

在节点上执行多个转换时,而不是使用setScale / setTransform / setRotate方法,通常更容易向getTransforms()方法提供转换列表。