2009-06-01 4 views
0

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

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

}

+0

Я не вижу проблемы, когда я запускаю этот код под NetBeans 6.5 с Java 1.6.0_11 в системе Windows XP. Продукт LinearGradient является гладким - не является блочным. Изменение размера поддерживает градиент для всего окна. Монитор, который я использую, - это Samsung 214T (управляемый с разрешением 1600x1200). – Refactor

+0

Обновление, я действительно вижу, но блочный эффект не драматичен. См. Представленный ответ. – Refactor

+0

Когда вы говорите, что есть блочные, есть сплошные блоки или есть какой-то волнистый эффект, который наводит на размышления о блоках? – Refactor

ответ

1

Блочный сумма не драматично.

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

Гипотеза состоит в том, что происходит несколько вещей. 1. Цвет r/g/b на самом деле не является непрерывным, но имеет 256 шагов. (8 бит). A 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] 
... 
+0

Рассмотрение фактических цветов, присутствующих (с точки зрения JavaFX) на градиенте, показывает от 2 до 5 вхождений каждого конкретного уровня цвета. Таким образом, присутствующие полосы имеют высоту от 2 до 5 пикселей для используемой высоты сцены. – Refactor