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
,但是它当然只从左边开始,因为路径的两端都在左边。。。