当前位置: 首页 > 知识库问答 >
问题:

JavaFX ImageView旋转更改拖放

陶腾
2023-03-14

我有一个ImageView,可以用鼠标拖放,点击按钮旋转90度。这两件事在独立完成时都可以工作(因此可以旋转或移动ImageView,而不是两者都可以)。当我旋转ImageView并尝试移动它时,它似乎是随机移动的。

我使用以下方法旋转图像视图:

imageView.setRotate(90);

这导致了我所说的看似随机的运动。

我还尝试使用以下方法旋转ImageView:

imageView.getTransforms().add(new Rotate(rotation, position + (width / 2), position + (height / 2));

位置是图像在屏幕上的位置。宽度和高度是ImageView的宽度和高度。

这在很大程度上起到了作用(ImageView不再以意外的方式移动),但是现在可以将其移动并放置在其父窗格(javafx.scene.layout.Pane)的边界之外。

ImageView保持在界限内的方式是:

imageView.setOnMouseDragged(new EventHandler<MouseEvent>(){
            public void handle(MouseEvent e) {
                if(!e.isPrimaryButtonDown()) return;

                ImageView iv = (ImageView) e.getSource();

                if(e.getX() > iv.getParent().getTranslateX()) iv.setX(e.getX());
                if(e.getY() > iv.getParent().getTranslateY()) iv.setY(e.getY());
            }
        });

此的父级是前面所述的窗格。在旋转ImageView之前,此操作效果良好。

我不知道该从这里走到哪里,所以我非常感谢您的帮助。谢谢

编辑到原始问题:

使用第二种旋转方法:

imageView.getTransforms().add(new Rotate(rotation, position + (width / 2), position + (height / 2));

这种方法的工作原理与x和y的翻译改变我旋转ImageView的事实不同。例如,如果我在旋转90度的图像上向右移动鼠标,那么鼠标拖动事件中e.getX()的位置不会改变,但e.getY()减小。这表明e.getX()和e.getY()的方式取决于ImageView的旋转。

有没有办法在不影响ImageView的x和y坐标的情况下旋转?

共有1个答案

许展鹏
2023-03-14

e.getX()e.getY()在图像视图的坐标系中;旋转后,该坐标系仍然是图像视图的局部坐标系。因此,您将图像视图的x坐标设置为旋转后与y坐标有更多关系的东西(以某种非平凡的方式)。

您应该通过计算鼠标相对于固定物体的移动量来计算拖动:例如场景。

以下是一个可用的SSCCE(双击可旋转):

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class ImageTransformTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        ImageView arrow = new ImageView(createImage());
        Pane pane = new Pane(arrow);
        pane.setMinSize(600,  600);

        new Dragger(arrow) ;
        arrow.setOnMouseClicked(e -> {
            if (e.getClickCount() == 2) {
                arrow.setRotate(arrow.getRotate() + 90);
            }
        });

        Scene scene = new Scene(pane) ;
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private static class Dragger {
        private double x ;
        private double y ;
        Dragger(ImageView imageView) {
            imageView.setOnMousePressed(e -> {
                x = e.getSceneX();
                y = e.getSceneY();
            });
            imageView.setOnMouseDragged(e -> {
                double deltaX = e.getSceneX() - x ;
                double deltaY = e.getSceneY() - y ;
                imageView.setX(imageView.getX() + deltaX);
                imageView.setY(imageView.getY() + deltaY);
                x = e.getSceneX() ;
                y = e.getSceneY() ;
            });
        }
    }

    private Image createImage() {
        WritableImage image = new WritableImage(100, 100);
        for (int y = 0 ; y < 40 ; y++) {
            for (int x = 0 ; x < 50 - 50 * y / 40 ; x++) {
                image.getPixelWriter().setColor(x, y, Color.TRANSPARENT);
            }
            for (int x = 50 - 50 * y / 40 ; x < 50 + 50 * y / 40 ; x ++) {
                image.getPixelWriter().setColor(x, y, Color.BLUE);
            }
            for (int x = 50 + 50 * y ; x < 100 ; x++) {
                image.getPixelWriter().setColor(x, y, Color.TRANSPARENT);
            }
        }
        for (int y = 40 ; y < 100 ; y++) {
            for (int x = 0 ; x < 100 ; x++) {
                image.getPixelWriter().setColor(x, y, x < 30 || x > 70 ? Color.TRANSPARENT : Color.BLUE);
            }
        }

        return image ;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 类似资料:
  • 在JavaFX中,我试图通过单击并拖动节点来移动它。如果节点不旋转,它工作得很好,但是当我旋转它时,它开始表现得很奇怪。 在45°左右,当我移动它时,它开始抖动,在60°时,它剧烈地来回抖动。在90°时,只要我开始移动节点,它就会飞离屏幕。 下面是我用来旋转和移动节点的代码。它来自连接到节点的鼠标侦听器。 编辑:这是一些示例输出,以及显示不同节点的图片。 未旋转且缓慢向左移动时的输出: 旋转时缓慢

  • 我有一个名为sampleImage的图像,我试图沿着x轴和y轴拉伸它,如下所示,当它处于横向时,它根本不起作用 然后,我在viewDidLayoutSubviews()中做了如下操作, 如果设备在中,这是有效的,但是一旦您将其旋转到并返回,所有更改都将消失。如何确保这些尺寸在旋转时保持不变?

  • 我正在开发一个应用程序,我需要改变旋转器背景布局,以匹配背景颜色。我研究发现,我需要创建一个9补丁图像。我已经完成了创建9补丁图像,并在应用程序中使用,但它看起来比正常的旋转器更大,而且我看不到下拉按钮在旋转器以及。 我很高兴,如果你们提供给我一个清晰的教程,从创建9补丁图像的旋转和使用它在应用程序。 旋转器代码

  • 我试图得到4个Vector2对象,它们代表一个精灵的4个角,在精灵自身围绕其中心旋转时旋转。但是,在下面的代码中,Vector2对象在客户端空间中围绕0,0旋转,而不是围绕对象的中心旋转。使用矩阵变换,是否有任何方法可以围绕对象的中心而不是全局坐标(0,0)旋转Vector2对象? 这是迄今为止旋转的函数:

  • 问题内容: 我试图在这个问题中创建一个类似于“奖杯轮”的可旋转节点。到目前为止,我具有甩尾功能,可以使用效果很好的UIPanGestureRecognizer在物理物体上添加角度脉冲。我也可以通过触摸停止旋转。 现在,我试图通过拖动或滑动手势来微调方向盘,这样,如果玩家对最终的效果不满意,就可以手动旋转/拖动/旋转它所喜欢的旋转方式。 目前,我将触摸的位置保存在touchesBegan中,并尝试在

  • 如何在拖动时更改可拖动元素的文本,我有来自cdk/拖放库的代码片段。它为在拖动时捕捉事件提供参数。我可以通过本机元素进行更改,但它会更改所有样式,而且我还需要在dragover或其他操作上设置另一个事件。如果要在拖动元素上放置随机文本,有哪些选项? 在Html 在TS