2

JavaFx 2.x シーンにビデオを埋め込み、必要に応じてサイズを変更して再配置したいと考えています。私が抱えている問題は次のとおりです。コンポーネントを作成してMediaViewから X または Y 座標を変換すると、ビュー全体が次のように適切に移動します。

MediaView mv = (...)
mv.setTranslateX(200);
mv.setTranslateY(200);

スケーリング プロパティを使用して同様の変換を行うことができます。

MediaView mv = (...)
mv.setScaleX(2);
mv.setScaleY(2);

これにより、インスタンスの次元が 2 倍に適切にスケーリングされます。 mv

ただし、問題は、これら 2 つの翻訳を組み合わせる場合です。mvインスタンスはスケーリングされていますが、常に画面座標になります(0,0)。もちろん、これは私の観点からは正しくない動作です。

MediaViewまた、コンポーネントをラッパーノード内にラップしてGroup、この要素で翻訳を実行しようとしました。動作は同じです。

MediaViewコンポーネントを同時に適切に移動およびスケーリングするにはどうすればよいですか?

編集:

here を使用していますが、これが私のコードです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();
    }
4

1 に答える 1

2

setScaleX、setScaleY を使用すると、スケーリングはノードの中心から発生します。

スケーリングに加えてある量だけ変換する場合は、必要な変換値を設定するときにスケーリングの拡張を考慮する必要があります。たとえば、ノードのサイズが 2 倍になる場合 (そして、スケーリングされていないノードの左上隅を基準とした位置にノードを移動する場合)、ノードの幅と高さをさらに半分だけ移動する必要があります。

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() メソッドに変換のリストを提供する方が簡単なことがよくあります。

于 2012-04-16T17:55:14.423 に答える