JavaFX中透明图片的鼠标事件

3

JavaFx的ImageView如果在透明像素上点击或拖动,则不会触发鼠标事件,例如按下或拖动,是否有任何方法可以解决这个问题并从透明区域检测鼠标事件?

我有这张图片enter image description here

我将其添加到这个非常简单的JavaFX场景enter image description here

使用名为view的ImageView,我想使用鼠标拖动事件移动它,所以我编写了这段代码

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application{

    double initMx, initMy,initX, initY;

    @Override
    public void start(Stage ps) throws Exception {
        StackPane pane = new StackPane();
        Image im = new Image("0.png");
        ImageView view = new ImageView(im);
        double fact = im.getWidth() / im.getHeight();

        view.setFitHeight(300);
        view.setFitWidth(300 * fact);

        view.setOnMousePressed(e->{
            initX = view.getTranslateX();
            initY = view.getTranslateY();
            initMx = e.getSceneX();
            initMy = e.getSceneY();
        });

        view.setOnMouseDragged(e->{
            double dx = initMx - e.getSceneX();
            double dy = initMy - e.getSceneY();

            double nx = initX - dx;
            double ny = initY - dy;

            view.setTranslateX(nx);
            view.setTranslateY(ny);

        });

        pane.getChildren().add(view);

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

        ps.setScene(scene);
        ps.show();

    }

    public static void main(String[] args) {
        launch(args);
    }
}

这段代码目前运行良好,但如果您在他的耳朵下面(或任何透明处)按下或拖动,将不会发生任何事情!如何解决这个问题!
3个回答

10

更自然且最简单的解决方案是将pick on bounds设置为true。

view.setPickOnBounds(true);

我之前不知道这个方法是做什么的,非常感谢。 - SDIDSA

1
你可以通过将此图像设置为 Button 中的图像来实现。
button.setGraphics(new ImageView(im));

注意:在添加ImageView后,您需要通过将按钮背景设置为透明背景色来从按钮中删除样式。

@JavaNoob 想知道为什么你决定接受这个 hack,而不是采用 (https://dev59.com/uK3la4cB1Zd3GeqPTd_4#51999089)[mipa] 提出的直截了当的解决方案 - 啊...只看到它比这个新半天 ;) - kleopatra
我会说MIPA解决方案更好。 - Ahmed Emad
确实没错!我没有看到你的答案,但这个对我有用。 - SDIDSA

0

如果你还没尝试过,请试一下这个:

   view.setOnMouseDragged(e->{
        double dx = initMx - e.getX();
        double dy = initMy - e.getY();

1
谢谢你试图提供帮助,但是...你试过了吗?问题实际上是透明像素对鼠标事件也是透明的,也就是说,对于图像形状之外的部分,该方法永远不会被调用。 - kleopatra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接