Я просто хочу узнать, есть ли какой-либо простой способ анимации макетов в JavaFx, например, VBox и HBox. Я хочу, чтобы мое приложение изменило цвет фона моего VBox через определенное время. Но я понял, что нет ничего похожего на FillTransition, которое я мог бы использовать для этого, используя VBox или HBox. Любые советы о том, как я могу это сделать?Анимационные макеты JavaFX
ответ
Цвет переход очень легко с 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();
Во-первых, я хотел бы поблагодарить вас за понимание. У меня есть несколько фоновых изображений, которые я переключаю при нажатии кнопки. Но я бы хотел его автоматизировать. i.e mainVbox.setStyle ("- fx-background-color: # FFDA8F;"); Я хотел бы автоматически менять каждый цвет. Как только я пройду через все цвета, я бы хотел, чтобы он вернулся к первому цвету и продолжался до завершения программы. –
@ Explorer24 Итак, что вы подразумеваете под «автоматически»? Вы не хотите нажимать кнопку, а менять цвет через определенный период? Кроме того, у вас есть фон _images_ (например, JPEG) или только фон _colors_? –
Да, я хотел бы изменить фон, если скажем 5 секунд. Я просто меняю цвета баков. Нет изображений. Хочу, чтобы я хотел больше походить на то, что вы сказали ранее, обновить цвет и плавно перейти к новому цвету в указанное время. –
- 1. JavaFX VBOX и HBox макеты
- 2. JavaFX - Сохранение/Загрузка - Формы/Макеты
- 3. Анимационные рамки
- 4. Анимационные маркеры
- 5. Анимационные инструменты
- 6. Являются ли некоторые макеты JavaFX несовместимыми с компьютерами Mac?
- 7. Анимационные окно прокрутки
- 8. Анимационные спрайт через MKMapView
- 9. Анимационные в SVG Group
- 10. Анимационные изменение высоты UICollectionView
- 11. Анимационные объект внутри холста
- 12. Android Анимация не Анимационные
- 13. QuartzCore анимационные фигуры?
- 14. CATransaction (еще) не Анимационные
- 15. Scripting Анимационные блоки iOS
- 16. JQuery анимационные баннеры
- 17. jQuery анимационные проблемы?
- 18. jQuery - paddingTop анимационные проблемы?
- 19. jQuery не анимационные ссылки
- 20. Анимационные спрайты в Cocos2d
- 21. Анимационные вход типа RANGE
- 22. Анимационные ограничения для iOS xibs
- 23. Анимационные прогресс бары с CSS
- 24. Анимационные остановки после первого кадра
- 25. Раздвижные анимационные заикания в аккордеоне
- 26. Последовательные анимационные вызовы не работают
- 27. Цель C - Анимационные блоки, мультипараметры
- 28. Анимационные блоки, мешающие друг другу
- 29. Edge Animate: Анимационные весы неправильные
- 30. CSS3 Анимационные меню Текущая страница
См: [Анимация После внесения соответствующих изменений макета] (http://stackoverflow.com/questions/16828234/animation-upon-layout-changes) – jewelsea
Если я понимаю, правильно, ваш вопрос не связан с компоновкой вообще. Вы просто хотите переместить цвет фона, не так ли? –
Может быть. Вы можете создать настраиваемое событие, которое запускается, когда вы хотите изменить все стили. Таким образом, вы можете, например, слушать его в пользовательских vbox или hbox, используя какой-то интерфейс и делать анимацию стиля? Не пробовал, но ... :) – Inge