如何在大表面上制作平滑的 JavaFX LinearGradient?

发布于 2024-07-21 15:06:51 字数 1008 浏览 9 评论 0原文

为什么以下代码会导致块状渐变? 即渐变不平滑,您可以看到一些组成它的矩形。

有办法解决这个问题吗?
顺便说一句,我在 Vista 上运行这个,但我也在 Mac 上经历过这个。

var stage:Stage = Stage {
title: "Louis' Photo Wall"
width: 900
height: 600

scene: Scene {
    content : Rectangle {
        width:  bind stage.scene.width
        height: bind stage.scene.height
        fill:LinearGradient {
            startX : 0.0
            startY : 0.0
            endX : 0.0
            endY : 1.0
            stops: [
                Stop {
                    color : Color {
                        red:0.0
                        blue:0.0
                        green:0.0
                    }

                    offset: 0.0
                },
                Stop {
                    color : Color {
                        red:0.8
                        blue:0.8
                        green:0.8
                    }
                    offset: 1.0
                },

            ]
        }

    }//OuterRectangle
}

}

Why does the following code lead to a blocky gradient? i.e. the gradient is not smooth, you can see some of the rectangles that make it up.

Is there a way to fix this?
BTW I'm running this on Vista, but I've also experienced this on a Mac as well.

var stage:Stage = Stage {
title: "Louis' Photo Wall"
width: 900
height: 600

scene: Scene {
    content : Rectangle {
        width:  bind stage.scene.width
        height: bind stage.scene.height
        fill:LinearGradient {
            startX : 0.0
            startY : 0.0
            endX : 0.0
            endY : 1.0
            stops: [
                Stop {
                    color : Color {
                        red:0.0
                        blue:0.0
                        green:0.0
                    }

                    offset: 0.0
                },
                Stop {
                    color : Color {
                        red:0.8
                        blue:0.8
                        green:0.8
                    }
                    offset: 1.0
                },

            ]
        }

    }//OuterRectangle
}

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小忆控 2024-07-28 15:06:51

块状数量并不引人注目。

转换为 1.0 的 endX 似乎会通过块状结果的对角化产生更明显的变化。

一个假设是有几件事正在发生。
1. r/g/b 颜色并不是真正连续的,而是有 256 级。 (8 位)。 255 的 0.8 是 204。
2. 当将一种颜色从 0 到 0.8 映射到 600 个像素时,每个像素都会获得增量,而这不能完全平滑。 当我跑步时,场景大小实际上是 792x566。 因此,在切换到下一种颜色之前,渐变将使用 566/204 = 2.775 像素表示一种颜色。 这会导致转换发生波动。

这并不能解释为什么使用 0.0 到 1.0 作为停止点(而不是 0.0 到 0.8)会导致(至少在我的跑步中)看似平滑的过渡。


后续:LinearGradient 可能使用一个 ofTheWay 方法进行插值。 代码示例和结果...

for (v in [0.00..1.00 step 1.0/600]) {
   println("{%7.5f v} {Color.WHITE.ofTheWay(Color.BLACK,v)}");
}

打印

0.00000 javafx.scene.paint.Color[red=255,green=255,blue=255,opacity=1.0]
0.00167 javafx.scene.paint.Color[red=255,green=255,blue=255,opacity=1.0]
0.00333 javafx.scene.paint.Color[red=254,green=254,blue=254,opacity=1.0]
0.00500 javafx.scene.paint.Color[red=254,green=254,blue=254,opacity=1.0]
0.00667 javafx.scene.paint.Color[red=253,green=253,blue=253,opacity=1.0]
0.00833 javafx.scene.paint.Color[red=253,green=253,blue=253,opacity=1.0]
0.01000 javafx.scene.paint.Color[red=252,green=252,blue=252,opacity=1.0]
0.01167 javafx.scene.paint.Color[red=252,green=252,blue=252,opacity=1.0]
0.01333 javafx.scene.paint.Color[red=252,green=252,blue=252,opacity=1.0]
0.01500 javafx.scene.paint.Color[red=251,green=251,blue=251,opacity=1.0]
0.01667 javafx.scene.paint.Color[red=251,green=251,blue=251,opacity=1.0]
...

The blocky amount is not dramatic.

Shifting to a endX of 1.0 seems to give a more obvious variation with a diagonalization of the blocky result.

A hypothesis is that a couple of things are going on.
1. A r/g/b color is not really continuous, but has 256 steps. (8 bits). A 0.8 of 255 is 204.
2. When one maps from 0 to 0.8 for a color into 600 pixels, one gets an increment per pixel that cannot be completely smooth. The scene size is actually 792x566 when I make a run. So the gradient would use has 566/204 = 2.775 pixels for one color before shifting to the next. That causes fluctuation where transitions are made.

This doesn't explain why using 0.0 to 1.0 for the stops (instead of 0.0 to 0.8) results (at least in my runs) with what seems to be a smooth transition.


Follow-up: There is an ofTheWay method that LinearGradient probably uses for interpolation. A code example and results...

for (v in [0.00..1.00 step 1.0/600]) {
   println("{%7.5f v} {Color.WHITE.ofTheWay(Color.BLACK,v)}");
}

which prints

0.00000 javafx.scene.paint.Color[red=255,green=255,blue=255,opacity=1.0]
0.00167 javafx.scene.paint.Color[red=255,green=255,blue=255,opacity=1.0]
0.00333 javafx.scene.paint.Color[red=254,green=254,blue=254,opacity=1.0]
0.00500 javafx.scene.paint.Color[red=254,green=254,blue=254,opacity=1.0]
0.00667 javafx.scene.paint.Color[red=253,green=253,blue=253,opacity=1.0]
0.00833 javafx.scene.paint.Color[red=253,green=253,blue=253,opacity=1.0]
0.01000 javafx.scene.paint.Color[red=252,green=252,blue=252,opacity=1.0]
0.01167 javafx.scene.paint.Color[red=252,green=252,blue=252,opacity=1.0]
0.01333 javafx.scene.paint.Color[red=252,green=252,blue=252,opacity=1.0]
0.01500 javafx.scene.paint.Color[red=251,green=251,blue=251,opacity=1.0]
0.01667 javafx.scene.paint.Color[red=251,green=251,blue=251,opacity=1.0]
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文