gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:38:19 27 4
gpt4 key购买 nike

我想在我的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com