Поворот ImageView в JavaFX - PullRequest
       26

Поворот ImageView в JavaFX

0 голосов
/ 04 ноября 2018

Я пытаюсь сделать старую ручку радио с вращением, и это вращение - моя проблема. Когда курсор мыши находится на ручке - все в порядке, однако, когда мышь покидает область ручки, все работает плохо. Вот мой код для ручки.
РЕДАКТИРОВАТЬ: я хочу вращать ручку, просто перемещаясь влево и вправо. Движения вверх и вниз меня не интересуют.
EDIT2: проблема не возникает только в области ручки. Я думаю, что это зависит от расстояние перемещения курсора.

@FXML
void onFrequencyKnobMouseMove(MouseEvent mouseEvent) {
    double vX = (mouseEvent.getX() - deltaX);
    System.out.println("VX: " + vX);

    double rotation = frequencyKnob.getRotate() + vX;
    if(rotation > 180) rotation=180;
    if(rotation < -180) rotation=-180;
    frequencyKnob.setRotate(rotation);
    System.out.println("ROTATION: " + rotation);

    tuningLine.setLayoutX(rotation*1.33+250);

    deltaX = mouseEvent.getX();
    System.out.println("DELTAX: " + deltaX + "\n\n");
}


@FXML
void onFrequencyKnobMouseDown(MouseEvent mouseEvent) {
    deltaX = mouseEvent.getX();
    //System.out.println(deltaX);
}

файл FXML

<ImageView fx:id="frequencyKnob" layoutX="856.0" layoutY="29.0" onMouseDragged="#onFrequencyKnobMouseMove" onMousePressed="#onFrequencyKnobMouseDown">
    <image>
        <Image url="@knob.png" />
    </image>
</ImageView>

Knob rotating gif

1 Ответ

0 голосов
/ 04 ноября 2018

Вы добавили обработчики для MouseEvent s к ImageView. Координаты, доступные через этот объект события, находятся в системе координат ImageView, который вращается. Вместо этого вы должны использовать координаты в системе координат, которая остается неизменной. Простейшим способом будет использование свойства sceneX вместо свойства x MouseEvent или преобразование в систему координат родителя.

Пример

@Override
public void start(Stage primaryStage) {
    Image image = new Image("knob.png");
    ImageView imageView = new ImageView(image);

    StackPane root = new StackPane(imageView);
    imageView.setPreserveRatio(true);
    imageView.setFitWidth(300);
    imageView.setFitHeight(300);

    Scene scene = new Scene(root, 500, 500);

    class MovedHandler implements EventHandler<MouseEvent> {

        double startX;
        double startRotate;

        @Override
        public void handle(MouseEvent event) {
            Point2D pt = imageView.localToParent(event.getX(), event.getY());
            double x = pt.getX();
            double newRotate = 3 * (x - startX) + startRotate;
            imageView.setRotate(newRotate);
        }

    }

    MovedHandler handler = new MovedHandler();
    imageView.setOnMouseDragged(handler);
    imageView.setOnMousePressed(event -> {
        Point2D pt = imageView.localToParent(event.getX(), event.getY());
        handler.startX = pt.getX();
        handler.startRotate = imageView.getRotate();
    });

    primaryStage.setScene(scene);
    primaryStage.show();
}
...