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

透明png图像的JavaFX拖动视图

西门飞翮
2023-03-14

我试图拖动对象表示为PNG图像透明背景从AnchorPane到HBox。

我使用以下线条将图像设置为拖动视图:

        SliderItemHandler mh = (SliderItemHandler) event.getSource();
        Dragboard db = mh.startDragAndDrop(TransferMode.COPY);
        db.setDragView(mh.getModule().getImage());
        ClipboardContent content = new ClipboardContent();
        db.setContent(content);

对于不透明的背景图像,这一切都很好,但对于透明的图像,图像的背景是白色的,不透明度为“0.8”。

我尝试为节点拍摄快照:

        db.setDragView(mh.snapshot(new SnapshotParameters(), null));

但它不起作用,白色背景仍然存在。有没有其他方法可以让它像原始图像一样透明?

共有2个答案

万俟小林
2023-03-14

您必须将快照参数更改为transpartent fill:

SnapshotParameters sp = new SnapshotParameters();
sp.setFill(Color.TRANSPARENT);
db.setDragView(mh.snapshot(sp, null));

结果将是透明的,没有白色边框。

高夜洛
2023-03-14

考虑到不透明度,我不确定你是如何获得白色背景的。然而,我重新创建了你的用例,并将向你展示我是如何实现的。

下面的图像是一个场景,分为左边的AnchorPane和右边的HBox。小透明圆圈是要复制的源代码,旁边的大圆圈是一个删除的图像,最右边的圆圈是当前正在拖动的圆圈。(截图不包括光标。)

正如你所看到的,在这三种场景中没有一种是白色(或几乎是白色)背景。这只是图像本身,图像本身在拖动时更加透明。

为了实现这一点,我们将考虑两个变量:源ImageView和目标HBox

@FXML
private HBox destination;
@FXML
private ImageView image;

我们希望图像被拖动,因此我们在ImageView添加了一个DRAG_DETECTED事件。

image.addEventHandler(MouseEvent.DRAG_DETECTED, mouseEvent -> {
    Dragboard db = image.startDragAndDrop(TransferMode.COPY);
    ClipboardContent content = new ClipboardContent();
    content.putImage(image.getImage());
    db.setContent(content);
    mouseEvent.consume();
});

然后我们希望目的地HBox接受拖动的ImageView

destination.addEventHandler(DragEvent.DRAG_OVER, (DragEvent event) -> {
    if (event.getDragboard().hasImage()) {
        event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
    }
    event.consume();
});

当然,我们希望在实际放置时将ImageView放入HBox。在这种情况下,它只是将其副本放在HBox中,但这当然是可以实现的。

destination.addEventHandler(DragEvent.DRAG_DROPPED, (DragEvent event) -> {
    Dragboard db = event.getDragboard();
    destination.getChildren().add(new ImageView(db.getImage()));
    event.setDropCompleted(true);
    event.consume();
});

这就是拖放图像的全部内容。透明图像没有白色背景。然而,如果你能够创建一个MCVE,如果它仍然保持不变的话,可能更容易调查你的问题。

 类似资料:
  • 我的任务是: 创建一个TBitmap对象 如何在Delphi XE中做到这一点?

  • 问题内容: 我正在尝试创建透明的png图像,并对其他各种png和jpg进行分层,以创建具有透明度的最终png。我在创建初始的空透明png时遇到问题。目前有白色背景。 谁能指出我正确的方向。到目前为止,这是我的代码… 问题答案: 在每个新图层上设置。 尝试这个:

  • #klem1,#klem2 { opacity:0.4; filter:alpha(opacity=40); /* For IE8 and earlier */ } #klem1:hover,#klem2:hover { opacity:1.0; filter:alpha(opacity=100); /* For IE8 and earlier */ } div.background { widt

  • JavaFx ImageView不会触发鼠标事件,例如,如果您单击或拖动透明像素,则按或拖动鼠标事件,是否有办法解决此问题并从透明区域检测鼠标事件? 使用ImageView命名视图,我想用鼠标拖动事件移动它,所以我写了这段代码 到目前为止,这段代码运行良好,但如果您在他耳朵下面(或任何透明的地方)按下或拖动某个位置,将不会发生任何事情!如何解决这个问题!

  • 假设我有一个视频和一个图像(碰巧包含一个alpha通道)。我可以像这样在视频上混合这个图像: (为了可读性,这里使用了多行,通常这是一个命令行)。 有没有一种方法可以添加一个自定义的整体不透明度或透明度混合因子,比如或其他什么,这会使图像只有50%的可见性?

  • 问题内容: 我当然希望我缺少一些东西,因为我不明白为什么这样做会起作用。我有一个PNG图片,它具有完全透明的背景,因为我想将其覆盖在内的其他图片上。 XCode项目中包含的PNG图像都可以正常工作。问题是,当我使用即时选择这些相同的PNG图像,然后将其分配给时,出于某些非常奇怪的原因,它没有将其视为具有透明性的PNG图像,而是添加了白色背景。 有人以前见过这个,我该如何解决? *更新#1: 我决定