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

标签 java javafx-2

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

相关文章:

java - 检索枚举的注释值

java - 我正在尝试从字符串中随机抽取一个单词。 java

javafx - 如何锁定子阶段直到新的子阶段关闭

非 Activity 用户的 Java 超时

javafx-2 - 如何重置 JavaFX2 中任务之间的进度指示器?

java - 如何获取完全加载页面的 html(使用 javascript)作为 java 中的输入?

java - 预定作业中的 Spring 应用程序 URL

java - 如何在 LINUX 中获取多个 JBOSS 节点的 CPU 使用率

java - cucumber .runtime.CucumberException : Couldn't load plugin class: json-pretty with Cucumber Selenium and Java

java - 为什么 JavaFX 中的 Transform 看起来像 3D?