【问题标题】:How do you make a smooth JavaFX LinearGradient over a large surface?如何在大表面上制作平滑的 JavaFX LinearGradient?
【发布时间】:2010-10-30 07:54:23
【问题描述】:

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

有没有办法解决这个问题?
顺便说一句,我在 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
}

}

【问题讨论】:

  • 当我在 Windows XP 系统上使用 Java 1.6.0_11 在 NetBeans 6.5 下运行该代码时,我没有发现问题。 LinearGradient 产生是平滑的——不是块状的。调整大小保持整个窗口的渐变。我使用的显示器是三星 214T(以 1600x1200 驱动)。
  • 更新,我确实看到了,但块状效果并不显着。查看提交的答案。
  • 当你说块状时,是有实心块还是有一种暗示块的波浪效果?
  • 是的,它看起来有点像打印在纸上时的渐变效果。你是对的,它非常小,但至少对于黑白来说已经足够了。我发现如果有三个停靠点,黑色、白色、黑色,我发现更容易注意到,白色是 0.9、0.9、0.9。我试着截屏,但由于某种原因截屏非常糟糕

标签: javafx linear-gradients


【解决方案1】:

块状的数量并不引人注目。

移动到 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]
...

【讨论】:

  • 检查渐变上的实际颜色(从 JavaFX 的角度来看)显示每个特定颜色级别出现 2 到 5 次。因此,对于所使用的舞台高度而言,存在的波段为 2 像素到 5 像素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多