2012-04-15 1 views
2

Я хотел бы вставить видео в мою сцену JavaFx 2.x, а также изменить его размер и перенести в мои нужды. Проблема, с которой я столкнулась, следующая. Если я строй MediaView компонента, а затем перевести X или Y координат, то вся точка зрения является переставить так:Как масштабировать и устанавливать координаты MediaView?

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(); 
    } 
+0

Можете ли вы, пожалуйста, вставить код, тогда вы «объедините эти два перевода». –

+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() метода.

+0

Кажется, что вы правы. Сегодня я проведу некоторые тесты и приму ответ, если они подтвердят это утверждение. –

+0

Подтверждено - важная часть - это действительно тот факт, что масштабирование выполняется не из (0,0), как я ожидал, а из центра узла. Спасибо. –

+0

Есть ли способ сделать медиавизор централизованным, когда внутри панели? – cp101020304