2016-11-30 3 views
0

Возможно ли сделать простой фоновый «флеш-эффект» с постепенным исчезновением на произвольном узле/регионе/панели?Переход на цвет фона на JavaFX 8 Узел/Область/область

Я просто хочу показать тонкий/кратковременный красный/белый эффект «вспышки» на VBox (содержащий метку), чтобы привлечь к нему внимание, когда значение метки изменится.

Редактировать: Все примеры такого характера, которые я нашел до сих пор, похоже, используют «Shape» (который является узлом), но, конечно, VBox или панель не являются фигурой - так что это не Помогите мне слишком много. Вызов getShape() на VBox просто возвращает нуль, так что это не поможет (я думаю, что код макета еще не выполнен).

Редактировать 2: Это ПОЧТИ работает, но этот эффект dang, кажется, полностью переписывает (я думаю) все в VBox, включая текстовую метку.

ColorInput effect = new ColorInput(0, 0, 900, 25, Paint.valueOf("#FFDDDD")); 

Timeline flash = new Timeline(
    new KeyFrame(Duration.seconds(0.4), new KeyValue(effect.paintProperty(), Paint.valueOf("#EED9D9"))), 
    new KeyFrame(Duration.seconds(0.8), new KeyValue(effect.paintProperty(), Paint.valueOf("#E0DDDD"))), 
    new KeyFrame(Duration.seconds(1.0), new KeyValue(effect.paintProperty(), Paint.valueOf("#DDDDDD")))); 
vbox.setEffect(effect); 
flash.setOnFinished(e -> vbox.setEffect(null)); 
flash.play(); 
+0

Это обязательно, что он находится на VBox? –

+0

Не обязательно, но это должен быть контейнер или какой-то вид, чтобы он мог содержать текстовую метку. – User

ответ

2

Лучший способ будет обеспечивать пользовательскую анимацию, как это (уточняя ответ Фабиана):

@Override 
public void start(Stage primaryStage) { 

    Label label = new Label("Bla bla bla bla"); 

    Button btn = new Button("flash"); 
    VBox box = new VBox(10, label, btn); 
    box.setPadding(new Insets(10)); 

    btn.setOnAction((ActionEvent event) -> { 

     //************************** 
     //this animation changes the background color 
     //of the VBox from red with opacity=1 
     //to red with opacity=0 
     //************************** 
     final Animation animation = new Transition() { 

      { 
       setCycleDuration(Duration.millis(1000)); 
       setInterpolator(Interpolator.EASE_OUT); 
      } 

      @Override 
      protected void interpolate(double frac) { 
       Color vColor = new Color(1, 0, 0, 1 - frac); 
       box.setBackground(new Background(new BackgroundFill(vColor, CornerRadii.EMPTY, Insets.EMPTY))); 
      } 
     }; 
     animation.play(); 

    }); 

    Scene scene = new Scene(box, 100, 100); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 

} 
+0

Похоже на успех! – User

1

Вы можете анимировать эффект, например. DropShadow:

@Override 
public void start(Stage primaryStage) { 
    Label label = new Label("Bla bla bla bla"); 

    DropShadow shadow = new DropShadow(); 
    shadow.setColor(Color.RED); 
    shadow.setSpread(0.75); 

    Timeline shadowAnimation = new Timeline(
      new KeyFrame(Duration.ZERO, new KeyValue(shadow.radiusProperty(), 0d)), 
      new KeyFrame(Duration.seconds(0.15), new KeyValue(shadow.radiusProperty(), 20d))); 
    shadowAnimation.setAutoReverse(true); 
    shadowAnimation.setCycleCount(2); 

    Button btn = new Button("flash"); 
    btn.setOnAction((ActionEvent event) -> { 
     Node target = label; 
     target.setEffect(shadow); 
     shadowAnimation.setOnFinished(evt -> target.setEffect(null)); 
     shadowAnimation.play(); 
    }); 

    VBox box = new VBox(10, label, btn); 
    box.setPadding(new Insets(10)); 

    Scene scene = new Scene(box, 100, 100); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

Неплохая попытка, получил это, чтобы работать, но я думаю, что это все еще слишком тонко. Мне нужна «вспышка» для большей площади экрана, и я думаю, что короткое сообщение все равно можно упустить, если я не изменю большую область экрана. (По иронии судьбы, я знаю, что это возможно с Adobe Flash/Flex, но также должно быть разумное решение JFX!) – User

0

Вы можете создать поддельную форму и использовать FillTransition интерполятор применять заполнение формы на контрольном фоне.

public static void AnimateBackgroundColor(Control control, Color fromColor,Color toColor,int duration) 
{ 

    Rectangle rect = new Rectangle(); 
    rect.setFill(fromColor); 

    FillTransition tr = new FillTransition(); 
    tr.setShape(rect); 
    tr.setDuration(Duration.millis(duration)); 
    tr.setFromValue(fromColor); 
    tr.setToValue(toColor); 

    tr.setInterpolator(new Interpolator() { 
     @Override 
     protected double curve(double t) { 
      control.setBackground(new Background(new BackgroundFill(rect.getFill(), CornerRadii.EMPTY, Insets.EMPTY))); 
      return t; 
     } 
    }); 

    tr.play(); 
}