【问题标题】:Animating Layouts JavaFX动画布局JavaFX
【发布时间】:2015-04-15 22:16:51
【问题描述】:

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

【问题讨论】:

  • 如果我理解正确,您的问题与布局完全无关。你只是想转换背景颜色,对吧?
  • 也许吧。您可以创建一个自定义事件,只要您想更改所有样式就会触发该事件。所以你可以例如通过使用某种界面在自定义 vbox 或 hbox 中收听并制作样式动画?没试过,但是...:)

标签: java javafx


【解决方案1】:

2.0-SNAPSHOT version of ReactFX 的颜色转换非常容易:

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

现在每当您更新color 时,vbox 的背景颜色将在 500 毫秒内平滑过渡到新颜色。

如果你想每 5 秒改变一次颜色,你可以创建一个 EventStream 颜色,每 5 秒发射一种颜色,并使用该颜色来设置color:

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

停止动画。 如果在应用程序退出之前从场景中移除 VBox,则应停止动画以防止内存和 CPU 泄漏。上面的feedTo 方法返回一个Subcription,我在上面的示例代码中忽略了它。为了停止动画,你会这样做:

Subscription subscription = colorStream().feedTo(color);

// later
subscription.unsubscribe();

【讨论】:

  • 首先我要感谢您的洞察力。当按下按钮时,我有多个背景图像正在切换。但我想改为自动化它。即 mainVbox.setStyle("-fx-background-color: #FFDA8F;");我想自动更改为每种颜色。一旦我通过了所有颜色,我希望它回到第一种颜色并继续直到程序终止
  • @Explorer24 那么,“自动”是什么意思?您不想按下按钮,而是在一段时间后改变颜色?另外,您是否有背景 图像(如 JPEG)或只有背景 颜色
  • 是的,我想在 5 秒后更改背景。我只是在改变背景颜色。没有图像。我想要的更像你之前说的,更新颜色,在指定时间内平滑过渡到新颜色。
  • 如果可以的话,我将不胜感激您展示如何使用 VBox 或 HBox 执行此操作的代码示例。
  • ReactFx 允许你使用 CSS 颜色吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2016-08-25
  • 1970-01-01
  • 2015-02-12
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多