2012-03-19 139 views
5

我創建了一些形狀來學習,一切似乎都模糊了,就像一些反鋸齒,我沒有使用任何效果(我還沒有得到這些經驗教訓,哈哈)。JavaFX圖形「模糊」或反鋸齒? (沒有使用效果)

對於爲例,我畫的白線在黑色化背景爲1米像素寬度,但it's得到灰色!如果我將寬度更改爲2px,它會變白,但仍然沒有真正定義。

當我在「googleing」一切我發現了一個回合的方法setSmooth(false)上的形狀,但它並沒有任何區別。其他任何我應該改變或禁用的舞臺或場景我都不知道?

任何幫助表示讚賞。感謝您的建議...

對不起我的英語還需要改進太大聲笑...但它不是我的自然語言。

回答

3

Shape文檔:

大多數節點往往適用於他們僅整數翻譯和 他們往往使用整數座標來定義,以及有。對於 這種常見情況,用直線邊緣填充形狀往往是脆弱的,因爲它們與整數器件座標上的像素之間的裂縫對齊,因此傾向於自然覆蓋整個像素。

在另一方面,撫摸那些相同的形狀通常會導致模糊 概述因爲默認撫摸屬性同時指定該 默認筆劃寬度是1.0座標常常映射到正好1個 設備像素,並且還爲行程應跨越邊界 的形狀,在邊界任一側落下一半。由於許多常見形狀的邊界傾向於直接落在整數 座標上,並且這些整數座標通常精確地映射到整數設備位置,所以邊界趨於導致覆蓋整個設備位置上的像素行和列的50%覆蓋範圍 一個邊框的形狀,而不是100%覆蓋在一個或另一個。因此,填充可能通常很脆,但筆畫通常是模糊不清的。

兩種常見的解決方案,以避免這些模糊輪廓是使用較寬的 筆畫完全覆蓋多個像素 - 通常筆劃寬度的2.0 如果在效果無刻度變換將實現這一點 - 或指定任一StrokeType .INSIDE或StrokeType.OUTSIDE 筆劃樣式 - 這會將默認的單個筆劃偏置到 其中一個完整像素行或列,位於該形狀的 邊框的內部或外部。

而且還看到的Node文檔:

在設備像素級,整數座標映射到像素和像素的中心之間的角部 和裂縫出現在 之間的中點整數像素位置。因爲所有座標值都是用浮點數指定的,所以座標可以精確地指向這些角(當浮點值具有精確的整數值時)或者指向像素上的任何位置。例如,(0.5,0.5)的座標將指向舞臺上左上角的 像素的中心。類似地,具有10乘10的尺寸 的(0,0)的矩形將從舞臺上的左上角 像素跨越到第10掃描線上的第10像素的右下角。 矩形內最後一個像素的像素中心位於座標(9.5,9.5)處。

所以你的線條簡潔的選擇,當你有一個奇怪的筆劃寬度:

  1. 使用StrokeType.INSIDE或StrokeType.OUTSIDE筆觸樣式。
  2. 將形狀的座標偏移0.5像素,以便筆劃在線上而不是線之間的裂縫。
  3. 只需使用下一個偶數作爲筆畫寬度,例如1 => 2,3 => 4,等

至於爲什麼setSmooth(false)不工作,我不知道到底,我的猜測是,抗鋸齒它指的是獨立的抗鋸齒方式進行時筆畫以像素之間的裂縫爲中心,但我不知道爲什麼會這樣。

+0

我看了你粘貼的所有東西(我現在有點慚愧,因爲它使用了大量的搜索引擎,但從來沒有記得看看javafoc = \),並測試了所有解決方案! 1 - 在寬度爲1px的行中,如果我設置了INSIDE,則該行消失!有了OUTSIDE,它總共需要2px的寬度。不是我的需要的功能.. 2 - 這有完美的結果...我要和thas ... 3 - 這也適用,這是我之前找到的解決方案,但只適用於偶數... 無論如何,非常感謝您的回覆,它完全解決了我的問題。並教我一個理由:在問之前,閱讀javadoc!大聲笑... – 2012-03-20 20:37:05

+0

不要擔心,這是一個合理的問題,行爲,特別是'setSmooth',有點微妙,不是特別直觀。 – jewelsea 2012-03-20 20:39:57

+0

我編輯我的評論,因爲我按Enter鍵試圖打破這條線,並確認了第一部分......再次感謝! – 2012-03-20 20:42:55