2009-06-01 38 views
0

Pourquoi le code suivant conduit-il à un dégradé de blocs? c'est-à-dire que le dégradé n'est pas lisse, vous pouvez voir certains des rectangles qui le composent.Comment faire un JavaFX LinearGradient lisse sur une grande surface?

Y at-il un moyen de résoudre ce problème?
BTW Je l'utilise sur Vista, mais je l'ai aussi expérimenté sur 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

Je ne vois pas le problème quand je lance ce code sous NetBeans 6.5 avec Java 1.6.0_11 sur un système Windows XP. Le produit LinearGradient est lisse et non blocky. Le redimensionnement maintient le dégradé pour la totalité de la fenêtre. Mon moniteur que j'utilise est un Samsung 214T (conduit à 1600x1200). – Refactor

+0

Mise à jour, je le vois, mais l'effet de bloc n'est pas dramatique. Voir la réponse soumise. – Refactor

+0

Quand vous dites blocky, y a-t-il des blocs solides ou est-ce qu'il y a une sorte d'effet ondulé qui suggère des blocs? – Refactor

Répondre

1

Le montant est polyédrique pas dramatique.

Le décalage vers une finX de 1.0 semble donner une variation plus évidente avec une diagonalisation du résultat bloc.

Une hypothèse est qu'il se passe un certain nombre de choses. 1. Une couleur r/g/b n'est pas vraiment continue, mais comporte 256 étapes. (8 bits). Un 0,8 de 255 est 204. 2. Quand on mappe de 0 à 0.8 pour une couleur en 600 pixels, on obtient un incrément par pixel qui ne peut pas être complètement lisse. La taille de la scène est en réalité 792x566 quand je fais une course. Ainsi, le dégradé utiliserait 566/204 = 2,775 pixels pour une couleur avant de passer à la suivante. Cela provoque une fluctuation là où les transitions sont faites. Ceci n'explique pas pourquoi l'utilisation de 0.0 à 1.0 pour les arrêts (au lieu de 0.0 à 0.8) donne des résultats (au moins dans mes courses) avec ce qui semble être une transition en douceur.


Suivi: Il existe une méthode qui ofTheWay LinearGradient utilise probablement pour l'interpolation. Un exemple de code et résultats ...

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

qui imprime

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

L'examen des couleurs réelles présentes (du point de vue de JavaFX) sur le gradient montre 2 à 5 occurrences de chaque niveau de couleur spécifique. Les bandes présentes ont donc de 2 à 5 pixels de hauteur pour la hauteur de scène utilisée. – Refactor