JavaFX径向渐变

时间:2015-03-11 14:31:25

标签: css javafx

我想用JavaFX重现以下screen并试用这个(剥离的)代码:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception{
        primaryStage.setTitle("Hello World");
        primaryStage.setFullScreen(true);
        primaryStage.setFullScreenExitHint("");

        AnchorPane root = new AnchorPane();
        root.setStyle("-fx-background-color: " +
                "rgb(15,37,74), " +
                "radial-gradient(center 50% 50%, radius 65%, rgb(97,156,188) 10%, rgb(22,51,93));");
        Scene scene = new Scene(root, 600, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

但是我有以下问题来重现原始图片:

  • 我无法生成圆形渐变,因为AnchorPane是一个矩形,渐变是椭圆形的。据我所知,documentation圆形渐变是不可能的?
  • 原始图片的渐变不是线性的,而是有一些圆圈(中间是一个明亮的圆圈,外面是一个中等圆圈)。我试着玩一下,然后在停止颜色上添加百分比,但是当我这样做时(例如rgb(97,156,188) 30%, rgb(22,51,93)),我得到了一个更明亮的椭圆形可视化,我不明白。渐变的开始总是更亮,我不知道为什么:

Pic of ellipse

有谁能解释我在这里发生什么事?

1 个答案:

答案 0 :(得分:3)

从您想要复制的屏幕截图下载(800x600像素)图像,并使用颜色选择器,我得到以下(十进制r,g,b)值,从中心(400,300)遍历到左边(0,300):

  • (400, 300)(104, 163, 193)
  • (300, 300)(87, 145, 182)
  • (200, 300)(60, 113, 163)
  • (100, 300)(38, 85, 137)
  • (0, 300)(23, 56, 99)

看起来很接近我的线性(可能有一些普遍的模糊性和jpeg压缩会稍微改变一下这些值。)

所以这似乎是一个很好的近似值:

    root.setStyle("-fx-background-color: radial-gradient(center 50% 50%, radius 50%, rgb(104, 163, 193) 0%, rgb(23, 56, 99) 100%);");

我没有看到使用百分比使其循环的方法:您必须使用实际长度。如果规模可能会发生变化,那么当然你需要对此作出回应;您可以使用绑定执行此操作,如下所示:

    root.styleProperty().bind(Bindings.createStringBinding(() -> 
        String.format("-fx-background-color: radial-gradient(center %dpx %dpx, radius %dpx, rgb(104, 163, 193) 0%%, rgb(23, 56, 99) 100%%);",
                (int) (root.getWidth()/2), (int) (root.getHeight()/2), (int)(Math.max(root.getWidth(), root.getHeight())/2)), 
                root.widthProperty(), root.heightProperty()));

请注意,这不是一种高效的方式;内联样式通常是将CSS应用于节点的最慢方式,此处您将在节点的每个小维度变化上更改内联样式。但是,它似乎在我的系统上运行得很好;请注意,在同一视图中将渐变应用于多个节点可能不是一个好方法。