JavaFX 8节点/区域/窗格

时间:2016-11-30 20:15:54

标签: java javafx javafx-8

是否可以在任意节点/区域/窗格上逐渐淡入淡出,从而实现简单的背景“闪光”效果?

我只是想在VBox(包含标签)上显示一个微妙/简短的红/白“闪光”效果,以便在标签的值发生变化时引起对它的注意。

编辑:到目前为止我发现的所有这种性质的例子似乎都使用了“形状”(这是一个节点),但当然一个VBox或一个窗格不是一个形状 - 所以这没有帮助我太多了。在VBox上调用getShape()只返回一个null,所以没有帮助(我猜布局代码还没有执行)。

编辑2: 这个ALMOST有效,但是这个dang效果似乎完全覆盖了(我认为)VBox中的所有内容,包括文本Label。

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();

3 个答案:

答案 0 :(得分:5)

最好的方法是提供一个自定义动画,就像这样(详细说明法比安答案):

@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();

}

答案 1 :(得分: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();
}

答案 2 :(得分:0)

您可以创建假形状并使用 FillTransition 插值器将形状填充应用于控件背景。

Dim BlobList As IEnumerable(Of CloudBlockBlob) = blobClient.GetContainerReference("ContainerName").ListBlobs(prefix := "ABC.pdf").OfType(Of CloudBlockBlob)