设置布局动画JavaFX

设置布局动画JavaFX,java,javafx,Java,Javafx,我只是想知道是否有任何简单的方法可以在JavaFx中设置布局动画,比如VBox和HBox。我希望我的应用程序在指定时间后更改VBox的背景色。但我意识到,没有什么类似于FillTransition的东西可以用VBox或HBox来实现。关于如何做到这一点,您有什么建议吗?颜色转换非常容易: 完整的可运行演示如下所示: import java.time.Duration; import javafx.application.Application; import javafx.beans.prop

我只是想知道是否有任何简单的方法可以在JavaFx中设置布局动画,比如VBox和HBox。我希望我的应用程序在指定时间后更改VBox的背景色。但我意识到,没有什么类似于FillTransition的东西可以用VBox或HBox来实现。关于如何做到这一点,您有什么建议吗?

颜色转换非常容易:

完整的可运行演示如下所示:

import java.time.Duration;

import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.Scene;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import org.reactfx.EventStream;
import org.reactfx.EventStreams;
import org.reactfx.value.Val;


public class ChangingBackgroundColor extends Application {

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

    private static final Color[] COLORS = new Color[] {
        Color.WHITE, Color.AQUA, Color.web("#FFDA8F"), Color.CORAL, Color.CYAN
    };

    @Override
    public void start(Stage stage) throws Exception {
        VBox vbox = new VBox();

        ObjectProperty<Color> color = new SimpleObjectProperty<>(COLORS[0]);
        Val<Background> animBgr = Val.animate(color, Duration.ofMillis(500))
                .map(c -> new Background(new BackgroundFill(c, null, null)));
        vbox.backgroundProperty().bind(animBgr);

        colorStream().feedTo(color);

        stage.setScene(new Scene(vbox, 400, 400));
        stage.show();
    }

    private EventStream<Color> colorStream() {
        return EventStreams.ticks(Duration.ofSeconds(5))
                .accumulate(0, (n, t) -> (n + 1) % COLORS.length)
                .map(i -> COLORS[i]);
    }
}

请看:如果我理解正确,您的问题与布局无关。你只是想改变背景色,对吧?也许吧。您可以创建一个自定义事件,该事件将在您想要更改所有样式时触发。例如,您可以使用某种界面在自定义vbox或hbox中收听它,并制作样式动画?我没有试过,但是…:)首先我要感谢你的洞察力。当按下按钮时,我会切换多个背景图像。但是我想把它自动化。i、 e mainVbox.setStyle(“-fx背景色:#FFDA8F;”);我想自动更改为每种颜色。一旦我看完了所有的颜色,我希望它回到第一种颜色,并继续到程序termination@Explorer24那么,你说的“自动”是什么意思?你不想非得按下按钮,而是想在一段时间后改变颜色?还有,你有背景图像(比如JPEG)还是只有背景颜色?是的,我想在5秒钟后改变背景。我只是在换底色。没有图像。“想要我想要”更像您之前所说的,在指定的时间内更新颜色并平滑过渡到新颜色。如果可以,我希望提供一个代码示例,演示如何使用VBox或HBox执行此操作。ReactFx允许您使用CSS颜色吗?
private static final Color[] COLORS = new Color[] {
    Color.WHITE, Color.AQUA, Color.web("#FFDA8F"), Color.CORAL, Color.CYAN
};

private EventStream<Color> colorStream() {
    return EventStreams.ticks(Duration.ofSeconds(5))
            .accumulate(0, (n, t) -> (n + 1) % COLORS.length)
            .map(i -> COLORS[i]);
}

colorStream().feedTo(color);
import java.time.Duration;

import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.Scene;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import org.reactfx.EventStream;
import org.reactfx.EventStreams;
import org.reactfx.value.Val;


public class ChangingBackgroundColor extends Application {

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

    private static final Color[] COLORS = new Color[] {
        Color.WHITE, Color.AQUA, Color.web("#FFDA8F"), Color.CORAL, Color.CYAN
    };

    @Override
    public void start(Stage stage) throws Exception {
        VBox vbox = new VBox();

        ObjectProperty<Color> color = new SimpleObjectProperty<>(COLORS[0]);
        Val<Background> animBgr = Val.animate(color, Duration.ofMillis(500))
                .map(c -> new Background(new BackgroundFill(c, null, null)));
        vbox.backgroundProperty().bind(animBgr);

        colorStream().feedTo(color);

        stage.setScene(new Scene(vbox, 400, 400));
        stage.show();
    }

    private EventStream<Color> colorStream() {
        return EventStreams.ticks(Duration.ofSeconds(5))
                .accumulate(0, (n, t) -> (n + 1) % COLORS.length)
                .map(i -> COLORS[i]);
    }
}
Subscription subscription = colorStream().feedTo(color);

// later
subscription.unsubscribe();