2009-06-01 11 views
0

Warum führt der folgende Code zu einem blockigen Gradienten? d. h. der Farbverlauf ist nicht glatt, Sie können einige der Rechtecke sehen, aus denen er besteht.Wie erstellt man einen glatten JavaFX LinearGradient auf einer großen Fläche?

Gibt es eine Möglichkeit, das zu beheben?
BTW Ich betreibe dies auf Vista, aber ich habe das auch auf einem Mac erlebt.

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

druckt ich das Problem nicht sehen, wenn ich diesen Code unter NetBeans 6.5 mit Java 1.6.0_11 auf einem Windows XP-System ausgeführt werden. Das LinearGradient-Produkt ist glatt - nicht blockartig. Bei der Größenanpassung wird der Farbverlauf für das gesamte Fenster beibehalten. Monitor, den ich benutze, ist ein Samsung 214T (angetrieben bei 1600x1200). – Refactor

+0

Update, ich sehe es, aber der blockige Effekt ist nicht dramatisch. Siehe übermittelte Antwort. – Refactor

+0

Wenn du blocky sagst, gibt es feste Blöcke oder gibt es einen welligen Effekt, der auf Blöcke hindeutet? – Refactor

Antwort

1

Die blocky Menge ist nicht dramatisch.

Die Verschiebung auf ein EndX von 1,0 scheint eine offensichtliche Variation mit einer Diagonalisierung des blockigen Ergebnisses zu ergeben.

Eine Hypothese ist, dass ein paar Dinge passieren. 1. Eine r/g/b-Farbe ist nicht wirklich kontinuierlich, sondern hat 256 Schritte. (8 Bits). Ein 0.8 von 255 ist 204. 2. Wenn man von 0 bis 0.8 für eine Farbe in 600 Pixel abbildet, erhält man ein Inkrement pro Pixel, das nicht vollständig glatt sein kann. Die Szenengröße ist tatsächlich 792x566, wenn ich einen Lauf mache. Also würde der Gradient 566/204 = 2,775 Pixel für eine Farbe verwenden, bevor er zum nächsten wechselt. Das verursacht Fluktuation, wo Übergänge gemacht werden.

Dies erklärt nicht, warum bei der Verwendung von 0,0 bis 1,0 für die Anschläge (anstelle von 0,0 bis 0,8) Ergebnisse (zumindest in meinen Läufen), was ein reibungsloser Übergang zu sein scheint.


Follow-up: Es gibt eine Methode, die ofTheWay LinearGradient wahrscheinlich für die Interpolation verwendet. Ein Code-Beispiel und die Ergebnisse ...

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

die

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

Untersuchung der tatsächlichen Farben vorhanden (aus Sicht von JavaFX) auf dem Gradienten zeigt 2 bis 5 Vorkommen jeder bestimmten Farbebene. Daher sind die vorhandenen Bänder 2 Pixel bis 5 Pixel hoch für die verwendete Bühnenhöhe. – Refactor