我想在我的JavaFx 2.x场景中嵌入一个视频,并调整它的大小并将其重新定位到我的需要。我遇到的问题是跟随。如果我构建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();
}
答案 0 :(得分:2)
当您使用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()方法提供变换列表。