我有一个节点,该节点是“本地”组的子级,而该节点是“全局”组的子级。我想在全局组的坐标中平移子级,但是TranslateTransition
在局部组坐标中移动子级。
在此示例中,我具有以下父级层次结构:
parent group
|- red circle
|- child group
|- blue circle
我想让蓝色圆圈位于红色圆圈上方。如果我将其转换为红色圆圈的坐标,则它会远离它,因为它在自己的组中。如果我翻译整个小组,那就行了。
import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;
public class AnimTest extends Application {
@Override
public void start(Stage stage) throws Exception {
Circle c = new Circle(5, Color.BLUE);
Group group = new Group(c);
group.setTranslateX(40);
group.setTranslateY(50);
Circle target = new Circle(10, Color.RED);
target.setTranslateX(20);
target.setTranslateY(20);
Group parent = new Group(target, group);
TranslateTransition t1 = new TranslateTransition(Duration.seconds(1), c); // 'group' works
t1.setToX(target.getTranslateX());
t1.setToY(target.getTranslateY());
Button next = new Button("Play");
next.setOnAction(e -> t1.play());
Pane p = new Pane(parent);
p.setPrefSize(200, 200);
VBox root = new VBox(p, next);
stage.setScene(new Scene(root));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如何在红色圆圈的父级坐标中转换蓝色圆圈?
请理解,这是一个简单的示例。实际上,层次结构更大,看起来像
parent group
|- target node
|- group1
|- group2
|- group3
|- moving node
我也可以使用目标的边界而不是它的翻译属性来找到最终的目的地,但对于示例而言,翻译就足够了。
答案 0 :(得分:0)
您可以使用translate
和setTranslateX()
setTranslateY()
的任何节点,问题是如何知道每个方向的平移量
您可以通过确定要移动的Node
的边界来做到这一点
Bounds nodeBounds = node.localToScreen(node.getBoundInLocal());
以及目标节点的边界,然后您可以使用其边界进行翻译 我希望这会有所帮助
答案 1 :(得分:0)
您可以结合使用Node.localToScene
和Node.sceneToLocal
在同一场景中的坐标系之间进行转换(假设转换是可逆的,并且不按0或类似的比例缩放)。
private static Point2D convertCoordinater(Node source, Node target, double x, double y) {
Point2D sceneCoords = source.localToScene(x, y);
return target.sceneToLocal(sceneCoords);
}
Point2D targetCoordinates = convertCoordinater(parent, group, target.getTranslateX(), target.getTranslateY());
t1.setToX(targetCoordinates.getX());
t1.setToY(targetCoordinates.getY());