FadeTransition:不淡出子节点,仅淡出背景

par*_*cer 4 java javafx

我有这个简单的课程:

测试.java

import javafx.animation.FadeTransition;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Test extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        Pane pane = new Pane();
        
        Button testButton = new Button("Test");
        testButton.setStyle("-fx-background-color: green;");

        pane.getChildren().add(testButton);
        pane.setStyle("-fx-background-color: red;");

        FadeTransition transition = new FadeTransition(Duration.millis(5000), pane);
        transition.setFromValue(1.0);
        transition.setToValue(0.0);
        transition.setCycleCount(Timeline.INDEFINITE);
        transition.setAutoReverse(true);
        transition.play();

        Scene scene = new Scene(pane, 500, 500);

        stage.setMinWidth(500);
        stage.setMinHeight(500);

        stage.setTitle("Test");
        stage.setResizable(false);

        stage.setScene(scene);
        stage.show();
    }
}
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

在此输入图像描述

然而当它消失时,它就变成了这样:

在此输入图像描述

如何使淡入淡出过渡仅影响红色背景而不影响绿色按钮?

所以它看起来像这样:

在此输入图像描述

Gio*_*ras 5

使用堆栈窗格

堆

您可以使用StackPane root 以及 :PaneButton stackpane 的子级。Button 不受转换影响,因为它不再是 pane 的子级。

如果您需要为不同的节点使用不同的对齐方式,您可以使用 StackPane 类中的静态方法setAligment,该方法需要子节点和位置作为参数

public class  App extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        
        Pane pane = new Pane();
        
        Button testButton = new Button("Test");
        testButton.setStyle("-fx-background-color: green;");

        StackPane stackPane = new StackPane(pane,testButton);
        stackPane.setAlignment(Pos.TOP_LEFT);
        
        pane.setStyle("-fx-background-color: red;");

        FadeTransition transition = new FadeTransition(Duration.millis(5000), pane);
        transition.setFromValue(1.0);
        transition.setToValue(0.0);
        transition.setCycleCount(Timeline.INDEFINITE);
        transition.setAutoReverse(true);
        transition.play();

        Scene scene = new Scene(stackPane, 500, 500);

        stage.setMinWidth(500);
        stage.setMinHeight(500);

        stage.setTitle("Test");
        stage.setResizable(false);

        stage.setScene(scene);
        stage.show();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这就是我将使用的方法。但请注意,您还可以设置背景颜色的动画。虽然它有点复杂,因为你不能直接为“background”属性设置动画。每次颜色变化时,您都必须为颜色设置动画并自行设置背景(“Color”实现“Interpolatable”)。 (4认同)
  • 动画颜色更准确,不需要额外的节点 (2认同)
  • 这两个相关的[例子](/sf/answers/5081176901/)对比更新节点或背景;那里引用的一个例子实现了“extends Interpolator”来为颜色设置动画。 (2认同)