2015-02-15 2 views
1

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

+0

См: [Анимация После внесения соответствующих изменений макета] (http://stackoverflow.com/questions/16828234/animation-upon-layout-changes) – jewelsea

+0

Если я понимаю, правильно, ваш вопрос не связан с компоновкой вообще. Вы просто хотите переместить цвет фона, не так ли? –

+0

Может быть. Вы можете создать настраиваемое событие, которое запускается, когда вы хотите изменить все стили. Таким образом, вы можете, например, слушать его в пользовательских vbox или hbox, используя какой-то интерфейс и делать анимацию стиля? Не пробовал, но ... :) – Inge

ответ

0

Цвет переход очень легко с 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 удален со сцены до выхода приложения, анимацию следует остановить, чтобы предотвратить утечку памяти и процессора. Приведенный выше метод feedTo возвращает Subcription, который я проигнорировал в приведенном выше примере кода. Для того, чтобы остановить анимацию, вы могли бы сделать:

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

// later 
subscription.unsubscribe(); 
+0

Во-первых, я хотел бы поблагодарить вас за понимание. У меня есть несколько фоновых изображений, которые я переключаю при нажатии кнопки. Но я бы хотел его автоматизировать. i.e mainVbox.setStyle ("- fx-background-color: # FFDA8F;"); Я хотел бы автоматически менять каждый цвет. Как только я пройду через все цвета, я бы хотел, чтобы он вернулся к первому цвету и продолжался до завершения программы. –

+0

@ Explorer24 Итак, что вы подразумеваете под «автоматически»? Вы не хотите нажимать кнопку, а менять цвет через определенный период? Кроме того, у вас есть фон _images_ (например, JPEG) или только фон _colors_? –

+0

Да, я хотел бы изменить фон, если скажем 5 секунд. Я просто меняю цвета баков. Нет изображений. Хочу, чтобы я хотел больше походить на то, что вы сказали ранее, обновить цвет и плавно перейти к новому цвету в указанное время. –

Смежные вопросы