我想在我的 JavaFx 2x 场景中嵌入一个视频,并根据我的需要调整它的大小和位置。我遇到的问题如下。如果我建立一个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
同时组成部分?
Edit:
这是我的代码,尽管我在这里使用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() 方法提供变换列表通常更容易。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)