Animation Javafx重新定位和旋转

Animation Javafx重新定位和旋转,animation,javafx,rotation,relocation,Animation,Javafx,Rotation,Relocation,我在javafx中有一个节点,它在时间轴中移动。 现在我还要旋转节点。 我试过了,但每次节点不再保持路径并“飞走”。有没有办法重新链接和旋转(我用rotatetransition试过) 编辑: 这就是我的观点——课堂 public class MyView extends ImageView{ public MyView (Image image) { super(image); RotateTransition transition = new RotateTransit

我在javafx中有一个节点,它在时间轴中移动。 现在我还要旋转节点。 我试过了,但每次节点不再保持路径并“飞走”。有没有办法重新链接和旋转(我用rotatetransition试过)

编辑:

这就是我的观点——课堂

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(); // */

}
}
在另一节课上,我有:

 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(); // */
}
private void startMoveAnimation(MyView[]视图){
x++;
y++;
this.timeline=新的timeline();
timeline.setCycleCount(Animation.unfinite);
moveEvent=neweventhandler(){
@凌驾
公共无效句柄(ActionEvent事件){
用于(视图:视图){
视图。重新定位(x,y);
}
}
}
};
KeyFrame moveKeyFrame=新的关键帧(持续时间.毫秒(速度),moveEvent);
timeline.getKeyFrames().add(moveKeyFrame);
timeline.play();//*/
}

x和y是双值。

这是我首先要尝试的:
将节点放入一个组中。将组添加到父级而不是节点。在组上执行“平移”动画,在节点本身上执行“旋转”动画。这只是我无法尝试的第一个猜测,因为您没有提供一个最小的可复制示例。

这是我将首先尝试的:
将节点放入一个组中。将组添加到父级而不是节点。在组上执行“平移”动画,在节点本身上执行“旋转”动画。这只是我无法尝试的第一个猜测,因为您没有提供一个最小的可复制示例。

使用转换可以更好地控制转换的顺序。此外,某些Transfrom允许您指定轴心点,例如
节点.rotate
属性无法指定轴心点。列表中的变换是“从右向左”应用的。(首先应用具有最高索引的变换)

以下示例显示了如何移动围绕其自身中心旋转的矩形(即使循环重置为原始位置,而不是沿同一方向连续移动,但变换的属性可以以任意方式独立设置动画):


使用转换可以更好地控制转换的顺序。此外,某些Transfrom允许您指定轴心点,例如
节点.rotate
属性无法指定轴心点。列表中的变换是“从右向左”应用的。(首先应用具有最高索引的变换)

以下示例显示了如何移动围绕其自身中心旋转的矩形(即使循环重置为原始位置,而不是沿同一方向连续移动,但变换的属性可以以任意方式独立设置动画):


显示一些代码,以便我们可以尝试帮助您我添加了一个示例显示了一些代码,以便我们可以尝试帮助您我添加了一个示例您确定转换是从右向左而不是从左向右应用的吗?如果在索引
0
处有一个
Rotate
,在索引
1
处有一个
Translate
,我觉得节点首先旋转,然后沿旋转轴平移。如果它是从右向左的,它不是先沿着非旋转轴平移,然后旋转吗?或者我只是在概念上遗漏了什么?@Slaw如果交换变换,则首先通过translate将节点移动到不同的位置;这不会影响旋转的轴心点。旋转然后围绕轴心点旋转整个物体。假设你想用指南针画一个圆。中心是(0,0)。我们将从纸上的针开始,铅笔(大致)在(0,0)处。然后设置半径(“平移铅笔”),然后围绕(0,0)旋转铅笔。这与上面程序的输出不同(考虑到rect的中心是(0,0))。啊,你说得对。我的错误印象是:(1)轴点被绑定到
矩形的中心,
平移
正在修改
x
y
属性,这些属性会影响局部边界,而局部边界又会形成中心点,因此轴点,使用
矩形
移动。这两种印象都是错误的(我本应该知道,但由于某种原因忘记了)。您知道该订单的记录位置吗?因为似乎没有指定。@Slaw在javadoc中似乎没有很清楚地指出这一点。但是,有几个变换表明列向量从右侧相乘,并且组合矩阵的工作原理与将两者添加到
变换
列表的工作原理相同。(只是不要看
旋转
;那里的信息是错误的)。声明矩阵乘法的顺序与“变换”列表中的顺序相同,并且类描述显示了矩阵是否确实从右向左而不是从左向右应用了变换?如果在索引
0
处有一个
Rotate
,在索引
1
处有一个
Translate
,我觉得节点首先旋转,然后沿旋转轴平移。如果它是从右向左的,它不是先沿着非旋转轴平移,然后旋转吗?或者我只是在概念上遗漏了什么?@Slaw如果交换变换,则首先通过translate将节点移动到不同的位置;这不会影响旋转的轴心点。旋转然后围绕轴心点旋转整个物体。假设你想用指南针画一个圆。中心是(0,0)。我们将从纸上的针开始,铅笔(大致)在(0,0)处。然后设置半径(“平移铅笔”),然后围绕(0,0)旋转铅笔。这与上面程序的输出不同(考虑到rect的中心是(0,0))。啊,你说得对。我有一个错误的印象,即轴点和轴都是固定的
@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();
}