如何在翻译过渡Javafx期间获取Circle / Node的当前坐标

时间:2015-01-31 21:37:16

标签: javafx

这已经被大脑绞了两天了。我已经阅读了节点/圈子的javadocs,似乎无法找到解决方案。

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

 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而不移动形状本身?或者在翻译过程中获取圆圈/节点的当前位置。

我确定我的事情过于复杂,而且有一种方法可以设置每个圆圈都有一个onclick鼠标事件来检测命中,所以我不需要为命中做计算,但我是不知道怎么做。

干杯

卢西奥

2 个答案:

答案 0 :(得分:1)

您不需要进行坐标计算:只需在您感兴趣的节点上注册一个鼠标监听器。我不确定您的要求是什么,但是

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");
    }
});

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

第一个版本(用目标注册鼠标监听器)更自然,可能就是你想要的。

答案 1 :(得分:0)

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

    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);