Я просто хочу узнать, есть ли простой способ анимации макетов в JavaFx, таких как VBox и HBox. Я хочу, чтобы мое приложение изменило цвет фона моего VBox через определенное время. Но я понял, что нет ничего похожего на FillTransition, которое я мог бы использовать для этого, используя VBox или HBox. Любые советы о том, как я могу это сделать?
Цветовой переход очень прост с версией ReactFX 2.0-SNAPSHOT:
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
, 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 удален со сцены до выхода приложения, анимацию следует остановить, чтобы предотвратить утечку памяти и процессора. Метод feedTo
выше возвращает Subcription
, который я проигнорировал в приведенном выше примере кода. Чтобы остановить анимацию, вы должны:
Subscription subscription = colorStream().feedTo(color);
// later
subscription.unsubscribe();