Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当调用具有内部路径的metod时,如何使pathTransition从右侧或左侧随机开始?_Java_Javafx_Path - Fatal编程技术网

Java 当调用具有内部路径的metod时,如何使pathTransition从右侧或左侧随机开始?

Java 当调用具有内部路径的metod时,如何使pathTransition从右侧或左侧随机开始?,java,javafx,path,Java,Javafx,Path,下面是创建和播放路径转换的方法的代码 void moveAereo() { //ImageView transition PathTransition aereo = new PathTransition(); PathElement[] path = new PathElement [5]; path[0]=new MoveTo(-60 ,30); path[1]=new LineTo(800 ,100);

下面是创建和播放路径转换的方法的代码

void moveAereo()
{    
        //ImageView transition
        PathTransition aereo = new PathTransition();
        PathElement[] path = new PathElement [5];
        path[0]=new MoveTo(-60 ,30);
        path[1]=new LineTo(800 ,100);
                path[2]= new LineTo(700,50);    
                path[3]= new LineTo(750,30);
        path[4]=new ClosePath();

        Path pista = new Path();
        pista.getElements().addAll(path);
        aereo.setNode(getAereo());
        aereo.setPath(pista);
                aereo.setAutoReverse(true);
        aereo.setInterpolator(Interpolator.LINEAR);
        aereo.setDuration(new Duration(5000));
        //ciclo infinito
        aereo.setCycleCount(Animation.INDEFINITE);
        aereo.play();
 }

只需确定随机播放动画的速率,并允许负速率。根据速率是正还是负,从结尾还是从开始播放动画

示例:

private final Random random = new Random();
private static final double MAX_RATE = 5;
private static final double MIN_ABSOLUTE_RATE = 0.5;

private double getRandomRate() {
    double magnitude = (MAX_RATE - MIN_ABSOLUTE_RATE) * random.nextDouble() + MIN_ABSOLUTE_RATE;
    return random.nextBoolean() ? magnitude : -magnitude;
}

@Override
public void start(Stage primaryStage) {
    Button btn = new Button("Change");

    Rectangle node = new Rectangle(10, 10);

    PathTransition aereo = new PathTransition();
    PathElement[] path = new PathElement[5];
    path[0] = new MoveTo(-60, 30);
    path[1] = new LineTo(800, 100);
    path[2] = new LineTo(700, 50);
    path[3] = new LineTo(750, 30);

    path[4] = new ClosePath();

    Path pista = new Path();
    pista.getElements().addAll(path);

    aereo.setPath(pista);
    aereo.setAutoReverse(true);
    aereo.setInterpolator(Interpolator.LINEAR);
    Duration duration = Duration.seconds(5);
    aereo.setDuration(duration);

    aereo.setCycleCount(Animation.INDEFINITE);
    aereo.setNode(node);

    btn.setOnAction((ActionEvent event) -> {
        double newRate = getRandomRate();

        aereo.setRate(newRate);
        if (newRate > 0) {
            // play from beginning
            aereo.playFromStart();
        } else {
            // play from end
            aereo.playFrom("end");
        }
    });

    Pane root = new Pane(btn, node);

    Scene scene = new Scene(root, 900, 200);

    primaryStage.setScene(scene);
    primaryStage.show();
}

动画启动后,当它到达路径的末端时,它应该仍然随机运行还是开始以相反的方向移动?当它到达末端时,它应该开始以相反的方向移动。这是问题的一个条件。感谢您的帮助。无论何时调用该方法,都应随机选择动画的速度。这也是我刚刚读到的另一个情况。:/我解决了速度问题,但我的位置有问题。playFrom(“结束”)。我真的不知道它是如何工作的。我尝试了一切,但它不是从结尾开始的。如果你知道有什么方法可以使动画在调用该方法时向上或向下启动,那将非常有用。Thanks@ErInd提示点
“end”
应该放在动画的末尾(当我测试它时,它是这样工作的),但是你也可以用
aereo.playFrom(“end”)
替换
aereo.playFrom(aereo.getTotalDuration())
。动画是向前还是向后播放取决于速率的符号。谢谢你的回答,但我用两种方式复制了你的代码,飞机只从一开始就开始。也许问题是速率的符号永远不会变为负值,或者您尝试了main,而我所做的是调用路径的方法。我首先认为这是aereo的问题。play()affer if and else,但我尝试将其移除,但没有任何改变。我不知道:/我也试过你的代码,在一个主类中使用矩形,它只从左边开始,从不改变位置。所以我不知道为什么汇率永远不会变为负值:/@Erid哦,对不起,这里使用了多个周期。应该是
getCycleDuration
而不是
getTotalDuration
,但是它当然只从左边开始,因为路径的两端都在左边。。。