Kolone13
Kolone13

Reputation: 31

Javafx relocate and rotate

i have an node in javafx which are moving in a timeline. Now i want rotate the node also. I tried it but everytime the node doesn't hold the path anymore and "fly away". Is there a way to relcate and rotate (I tried it with rotatetransition)?

Edit:

That is my View -Class

public class MyView extends ImageView{


public MyView (Image image) {
    super(image);

    RotateTransition transition = new RotateTransition();
    transition.setCycleCount(Animation.INDEFINITE);
    transition.setNode(this);
    transition.setDuration(Duration.millis(10));
    transition.setFromAngle(5);
    transition.setToAngle(5;
    transition.setAutoReverse(true);
    transition.play(); // */

}
}

On another class i have this:

 private void startMoveAnimation(MyView[] views) {
    x++;
    y++;
    this.timeline = new Timeline();
    timeline.setCycleCount(Animation.INDEFINITE);
    moveEvent = new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
                 for(View view: views){
                      view.relocate(x,y);
                 }

            }
        }
    };

    KeyFrame moveKeyFrame = new KeyFrame(Duration.millis(SPEED), moveEvent);
    timeline.getKeyFrames().add(moveKeyFrame);

    timeline.play(); // */
}

x and y are double values.

Upvotes: 0

Views: 1092

Answers (2)

fabian
fabian

Reputation: 82461

Using transforms gives you better control of the order of the transformations. Furthermore some transfroms allow you to specify a pivot point, which is not possible for e.g. the Node.rotate property. Transforms in a list are applied "right to left". (The transform with the highest index is applied first).

The following example shows how to move a rectangle rotating arount its own center (even though the cycle resets to the original position instead of continuously moving in the same direction, but the properties of the transforms can be animated independently in arbitrary ways):

@Override
public void start(Stage primaryStage) {
    Rectangle view = new Rectangle(100, 100);

    // pivot point = center of rect
    Rotate rotate = new Rotate(0, 50, 50);
    Translate translate = new Translate();

    // rotate first, then move
    view.getTransforms().addAll(translate, rotate);

    Timeline timeline = new Timeline(
            new KeyFrame(Duration.ZERO, new KeyValue(translate.xProperty(), 0d),
                    new KeyValue(translate.yProperty(), 0d), new KeyValue(rotate.angleProperty(), 0d)),
            new KeyFrame(Duration.seconds(2), new KeyValue(translate.xProperty(), 300d),
                    new KeyValue(translate.yProperty(), 500d), new KeyValue(rotate.angleProperty(), 360d)));
    timeline.setCycleCount(Animation.INDEFINITE);
    timeline.play();

    Pane root = new Pane(view);

    Scene scene = new Scene(root, 500, 500);
    primaryStage.setScene(scene);
    primaryStage.show();
}

Upvotes: 3

mipa
mipa

Reputation: 10650

That's what I would try first: Put the node into a Group. Add the Group to the parent instead of the node. Do the translate animation on the Group and do the rotate animation on the node itself. This is just a first guess which I cannot try out because you haven't provided a minimal reproducible example.

Upvotes: 0

Related Questions