【问题标题】:How to change the color of the rectangle after every cycle count?每次循环计数后如何更改矩形的颜色?
【发布时间】:2017-08-15 11:36:01
【问题描述】:

我有一个从左到右动画的矩形。我希望矩形在每次循环计数后随机更改颜色,但我希望它仅从选定的颜色中更改颜色。例如,我有红色、蓝色和橙色,然后我希望矩形只改变那些红色、蓝色和橙色的颜色。例如,如果它从左到右移动,那么首先它是蓝色的,然后经过一个循环计数(当它从左到右完成时),它应该将颜色变为红色或橙色等等。

这是我的以下代码:

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();
    }
  }

【问题讨论】:

    标签: java javafx colors


    【解决方案1】:

    使用Timeline 而不是TranslateTransitionTimeline 使用 KeyFrames 的集合,KeyFrame 允许您指定在到达帧时执行的处理程序,以及该属性的属性和值:

    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();
        }
    }
    

    【讨论】:

    • 它正在工作,谢谢。但是你能解释一下这行代码吗:e -> rect.setFill(palette[rng.nextInt(palette.length)]), new KeyValue(rect.yProperty(), 1040)
    • 要解释什么?这是对KeyFrame constructor 的调用的一部分。参数e -> rect.setFill(...)是到达frame时调用的事件处理函数,KeyValue是frame的key值。
    • 我不知道palette.length 是做什么的以及是什么(rect.yProperty(), 1040)。你能解释一下吗。我是新手,所以不太了解。不胜感激。
    • palette.length 是数组palette 的长度。 (rect.yProperty(), 1040) 是提供给KeyValue constructor 的参数。我无法在 cmets 中提供完整的 Java 教程来回答这个论坛上的问题。
    • 我看懂了palette.length,但还是没看懂(rect.yProperty(), 1040)。能否请您在聊天中打开此内容,以便您向我解释一下?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多