如何在 TranslationTransition Javafx 期间获取 Circle/Node 的当前坐标

How do I get the current co-ordinates of a Circle/Node during a TranslationTransition Javafx

这个问题已经绞尽脑汁两天了。我已经通读了 node/circle 的 javadoc,但似乎找不到解决方案。

我制作了一组圆圈并将它们分组为一个节点。

 target = new Group(OuterRingTarget, OuterWhiteRingTarget, MiddleRingTarget, MiddleWhiteRingTarget, InnerRingTarget, BullseyeTarget);

我在动画中设置大小和位置,例如

    OuterRingTarget.setCenterX(200);
    OuterRingTarget.setCenterY(200);
    OuterRingTarget.setRadius(25);

    OuterWhiteRingTarget.setCenterX(200);
    OuterWhiteRingTarget.setCenterY(200);
    OuterWhiteRingTarget.setRadius(22);
    OuterWhiteRingTarget.setStroke(Color.WHITE);

等等

我为 TranslateTransition 创建了 4 个随机数(从 x/y 和 setBy x/y 开始)。出于某种原因 .settoX 不起作用,所以我不得不使用 setByX。

       final TranslateTransition targetAnimation = new TranslateTransition(Duration.seconds(2));
        targetAnimation.setNode(target);
        targetAnimation.setFromX(x0);
        targetAnimation.setByX(x1);
        targetAnimation.setFromY(y0);
        targetAnimation.setByY(y1);
        targetAnimation.setCycleCount(1);
        targetAnimation.onFinishedProperty().set(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                AnimationTargetStart();
            }
        });
        targetAnimation.play();

我需要检查当用户点击时,用户点击的坐标是否等于圆圈所在的位置(即用户点击了节点)。为此,我需要检查圆圈在翻译转换过程中的位置。

有人在另一个帖子上建议双属性,我试过了,但没有用:

DoubleProperty xValue = new SimpleDoubleProperty();
    xValue.bind(BullseyeTarget.centerXProperty());
    xValue.addListener(new ChangeListener() {
    @Override
    public void changed(ObservableValue arg0, Object arg1, Object arg2) {

        System.out.println(" Current center X: " + (double) arg2);
    }
});

我也试过:

     double TargetXCentre = BullseyeTarget.getCenterX();
     double TargetYCentre = BullseyeTarget.getCenterY();

这只是返回我之前设置的值,而不是在转换期间返回更新后的值。有没有办法在不移动形状本身的情况下在过渡期间设置 .centerX?或在 translationtransition 期间获取 circles/node 的当前位置。

我确定我把事情复杂化了,并且有一种方法可以将每个圆圈设置为具有 onclick 鼠标事件来检测点击,这样我就不需要为点击进行计算,但是我我也不知道该怎么做。

干杯

卢西奥

您不需要进行坐标计算:只需向您感兴趣的节点注册一个鼠标侦听器即可。我不确定您的具体要求是什么,但是

target.setOnMousePressed(event -> {
    System.out.println("hit target!");
});

应该做你想做的。如果需要,您可以将 target 替换为任何组件圆圈。

如果您确实想跟踪坐标,顺便说一句,您需要知道平移过渡是通过操纵正在动画的节点的 translateXtranslateY 属性来工作的。这些 属性 值实质上是添加到圆圈的 centerXcenterY 属性中(这是一种简化,但它会起作用)。节点的 boundsInParent 属性 包含节点在其父节点坐标系中的边界(即添加到其 getChildren() 列表的节点),并说明所有转换(包括由 translateXtranslateY 属性定义的翻译)。因此,如果您向 target 的父级注册了一个鼠标侦听器,您可以按照

的方式做一些事情
targetContainer.setOnMousePressed(event -> {
    // coordinates of mouse relative to targetContainer:
    double mouseX = event.getX();
    double mouseY = event.getY();
    if (target.getBoundsInParent().contains(mouseX, mouseY)) {
        System.out.println("Hit target");
    }
});

(这与上面的代码不太一样,因为边界表示包含目标的矩形区域,而在目标本身上注册的鼠标事件处理程序只有在鼠标按下时才会被调用目标本身 - 即它考虑了形状。)

第一个版本(向目标注册鼠标侦听器)更自然,可能是您想要的。

这个问题的解决方案是更改以下内容:

    target = new Group(OuterRingTarget,OuterWhiteRingTarget,MiddleRingTarget,MiddleWhiteRingTarget,InnerRingTarget,BullseyeTarget);
    Group root = new Group(RectangleMouseBox,target);

    target = new Group(OuterRingTarget, OuterWhiteRingTarget, MiddleRingTarget, MiddleWhiteRingTarget, InnerRingTarget, BullseyeTarget);
    Group root = new Group(RectangleMouseBox);
    root.getChildren().addAll(target);