Как сделать плавный линейный градиент JavaFX на большой поверхности? - PullRequest
0 голосов
/ 01 июня 2009

Почему следующий код приводит к блочному градиенту? то есть градиент не является плавным, вы можете видеть некоторые прямоугольники, из которых он состоит.

Есть ли способ это исправить?
Кстати, я запускаю это на 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
}

}

1 Ответ

0 голосов
/ 01 июня 2009

Объемная сумма не впечатляет.

Переход к концу X 1.0 дает более очевидную вариацию с диагонализацией блочного результата.

Гипотеза состоит в том, что происходит пара вещей. 1. Цвет r / g / b на самом деле не является непрерывным, но имеет 256 шагов. (8 бит). 0,8 из 255 составляет 204. 2. Когда один отображает от 0 до 0,8 для цвета в 600 пикселей, он получает приращение на пиксель, которое не может быть полностью плавным. Размер сцены на самом деле составляет 792x566, когда я бегу. Таким образом, градиент будет использовать 566/204 = 2,775 пикселей для одного цвета, прежде чем перейти к следующему. Это вызывает колебания, когда переходы сделаны.

Это не объясняет, почему использование 0,0 до 1,0 для стопов (вместо 0,0 до 0,8) приводит (по крайней мере, в моих пробежках) к тому, что кажется плавным переходом.


Последующее наблюдение: существует метод ofTheWay, который LinearGradient, вероятно, использует для интерполяции. Пример кода и результаты ...

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]
...
...