【问题标题】:Rotation ImageView in JavaFXJavaFX中的旋转ImageView
【发布时间】:2018-11-04 16:58:32
【问题描述】:

我正在尝试用旋转来做旧的收音机旋钮,而旋转是我的问题。当鼠标光标在旋钮上时 - 一切正常,但是当鼠标离开旋钮区域时,一切都不好。这是我的旋钮代码。
编辑:我想通过左右移动来旋转旋钮。我对上下移动不感兴趣。
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>

【问题讨论】:

  • 您将事件处理程序添加到哪个节点? (您可以发布包含 fxml 相关部分的 fxml sn-p 吗?)
  • 当然,在 fxml 中只是带有 onMouseDragged 和 onMousePressed 的 ImageView
    ''

标签: javafx rotation imageview


【解决方案1】:

您将MouseEvents 的处理程序添加到ImageView。通过此事件对象可用的坐标位于旋转的ImageView 的坐标系中。您应该使用未修改的坐标系中的坐标。最简单的方法是使用sceneX 属性而不是MouseEventx 属性,或者转换到父级的坐标系。

示例

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

【讨论】:

  • 非常感谢,但我无法在我的中实现此代码。我可以把我所有的代码都发给你吗? Main.java: pastebin.com/enSZ49Xn || Controller.java:pastebin.com/FS8FKMLy ||设计.fxml:pastebin.com/tgKWFCyz
  • @ŁukaszBocian 调整它应该不会太难(从您的原始代码开始)。将startX/startRotate 移动到控制器类,将handle 方法的实现复制到控制器中的处理程序方法(并且只有那些)并调整名称:handle-&gt;thisimageView-&gt;frequencyKnob、@987654336 @
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 2016-02-10
相关资源
最近更新 更多