我想在我的 JavaFx 2.x 场景中嵌入一个视频,并根据我的需要调整它的大小和位置。我遇到的问题如下。如果我构建一个 MediaView 组件,然后平移 X 或 Y 坐标,则整个 View 将被正确移动,如下所示:
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() 方法提供变换列表通常更容易。
关于java - 如何缩放和设置MediaView的坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10161931/