JavaFX ImageView旋转更改拖放

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaFX ImageView旋转更改拖放相关的知识,希望对你有一定的参考价值。

所以我有一个ImageView,可以使用鼠标拖放,并通过单击按钮旋转90度。这些都可以独立完成(因此可以旋转或移动ImageView,而不是两者都可以)。当我旋转ImageView并尝试移动它时,它似乎随机移动。

我使用以下方法旋转ImageView:

imageView.setRotate(90);

这导致我正在谈论的看似随机的运动。

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

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

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

这在很大程度上起作用(ImageView不再以意想不到的方式移动),但是现在它可以被移动并放置在Pane(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());
            }
        });

父母对此是前面提到的Pane。这工作正常,直到ImageView旋转。

我不知道从哪里去,所以我很感激任何帮助。谢谢。


编辑原始问题:

使用第二种旋转方法:

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

此方法与x和y的转换更改我旋转ImageView的事实不同。例如,如果我将鼠标移动到旋转90度的图像上,那么我的MouseDraggedEvent中e.getX()的位置不会改变,但e.getY()会减少。这表明e.getX()和e.getY()的方式依赖于ImageView的旋转。

有没有办法旋转而不影响图像视图x和y坐标?

答案

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 ImageView旋转更改拖放的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX:循环之间的旋转动画延迟

如何在鼠标单击上更改Imageview的图像

JavaFX - 拖放 TableCell

如何在 javafx imageView 中获取显示图像的宽度/高度?

JavaFX在拖放完成后获取拖放目标文件夹

使用CheckBoxListCell的Javafx listview不适用于拖放