如何在每次循环计数后更改矩形的颜色?

时间:2017-08-15 11:36:02

标签: java javafx colors

我有一个从左到右动画的矩形。我希望矩形在每个循环计数后随机改变颜色,但我希望它只改变所选颜色的颜色。例如,我有红色,蓝色和橙色,然后我希望矩形只改变红色,蓝色和橙色的颜色。例如,如果它从左向右移动,则首先是蓝色,然后在一个循环计数(从左到右完成)后,它应该将颜色更改为红色或橙色,依此类推。

以下是我的以下代码:

public class Rect extends Application {


@Override
public void start(Stage stage) {
    Pane canvas = new Pane();
    Scene scene = new Scene(canvas, 500, 600);
    Rectangle rect = new Rectangle (100, 40, 100, 100);
    rect.setArcHeight(50);
    rect.setArcWidth(50);
    rect.setFill(Color.BLUE);

    TranslateTransition tt1 = new TranslateTransition(Duration.millis(3000), rect);
    tt1.setByY(1000f);
    tt1.setCycleCount(Animation.INDEFINITE);
    tt1.setAutoReverse(false);
    tt1.play();
    canvas.getChildren().add(rect);
    stage.setScene(scene);
    stage.show();

}

public static void main(String[] args) {
    launch();
    }
  }

1 个答案:

答案 0 :(得分:2)

使用Timeline代替TranslateTransitionTimeline使用KeyFrame的集合,KeyFrame允许您指定在到达帧时要执行的处理程序,以及该属性的属性和值: / p>

import java.util.Random;

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Rect extends Application {

    @Override
    public void start(Stage stage) {
        Pane canvas = new Pane();
        Scene scene = new Scene(canvas, 500, 600);
        Rectangle rect = new Rectangle(100, 40, 100, 100);
        rect.setArcHeight(50);
        rect.setArcWidth(50);
        rect.setFill(Color.BLUE);

        Color[] palette = new Color[] { Color.RED, Color.BLUE, Color.ORANGE };
        Random rng = new Random();

        Timeline tt1 = new Timeline(
            new KeyFrame(
                Duration.millis(3000), 
                e -> rect.setFill(palette[rng.nextInt(palette.length)]), 
                new KeyValue(rect.yProperty(), 1040)
            )
        );

        tt1.setCycleCount(Animation.INDEFINITE);
        tt1.setAutoReverse(false);
        tt1.play();
        canvas.getChildren().add(rect);
        stage.setScene(scene);
        stage.show();

    }

    public static void main(String[] args) {
        launch();
    }
}