Анимация макетов JavaFX

1

Я просто хочу узнать, есть ли простой способ анимации макетов в JavaFx, таких как VBox и HBox. Я хочу, чтобы мое приложение изменило цвет фона моего VBox через определенное время. Но я понял, что нет ничего похожего на FillTransition, которое я мог бы использовать для этого, используя VBox или HBox. Любые советы о том, как я могу это сделать?

  • 0
    Смотрите: Анимация при изменении макета
  • 0
    Если я правильно понимаю, ваш вопрос вообще не связан с версткой. Вы просто хотите изменить цвет фона, верно?
Показать ещё 1 комментарий
Теги:
javafx

1 ответ

0

Цветовой переход очень прост с версией 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();
  • 0
    Во-первых, я хотел бы поблагодарить вас за понимание. У меня есть несколько фоновых изображений, которые я переключаю при нажатии кнопки. Но я бы хотел автоматизировать это. т.е. mainVbox.setStyle ("- fx-background-color: # FFDA8F;"); Я хотел бы изменить на каждый цвет автоматически. После того, как я прошел все цвета, я хотел бы, чтобы он вернулся к первому цвету и продолжил до завершения программы
  • 0
    @ Explorer24 Итак, еще раз, что вы подразумеваете под "автоматически"? Вам не нужно нажимать кнопку, а менять цвет после определенного периода? Кроме того, у вас есть фоновые изображения (например, JPEG) или только цвета фона?
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню