2012-08-09 15 views
2

在JavaFX 2.2中繪製清晰,不透明的髮際線的最佳方式是什麼?如何在JavaFX 2.2中繪製清晰,不透明的髮際線?

該文檔說,與strokeWidth0.0d這將是一個髮際線,但它根本不可見。值> 0.0d and <1.0d顯示非常好的行,但也不顯示不透明的行爲。當一條線切割另一條線時,相交點比線條的其餘部分要輕(我希望這種行爲具有某種透明度)。最後,1.0d繪製一個寬度爲幾個像素的白線。

這是我的測試代碼:

LineBuilder.create().startX(i*gridSize).startY(0).endX(i*gridSize).endY(height).smooth(false).stroke(Color.WHITE).strokeWidth(0.5d).fill(Color.WHITE).build();   

回答

3

可以使用Region子類,如Pane爲你的父母,擁有snapToPixel設置爲true。

此外,請參閱座標系統上的Node文件。

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

另見Shape文檔:

大多數節點往往適用於他們僅整數翻譯和 他們往往使用整數座標來定義,以及有。對於 這種常見情況,用直線邊緣填充形狀往往是脆弱的,因爲它們與整數器件座標上的像素之間的裂縫對齊,因此傾向於自然覆蓋整個像素。另一方面,撫摸那些相同的形狀可能經常導致模糊輪廓,因爲默認描邊屬性指定 默認筆觸寬度是1.0座標,其通常映射到 恰好1個設備像素並且筆劃應橫跨 跨越 形狀的邊界,在邊界的任一側落下一半。由於 許多常見形狀的邊界傾向於直接落在整數 座標上,並且這些整數座標通常精確映射到整數設備位置,所以邊界傾向於導致覆蓋整個設備位置上的像素行和列的50%覆蓋範圍 一個邊框的形狀,而不是100%覆蓋在一個或另一個。因此,填充可能通常很脆,但筆畫通常是模糊不清的。

兩種常見的解決方案,以避免這些模糊輪廓是使用較寬的 筆畫完全覆蓋多個像素 - 通常筆劃寬度的2.0 如果在效果無刻度變換將實現這一點 - 或指定任一StrokeType .INSIDE或StrokeType.OUTSIDE 衝程樣式 - 這將偏置缺省單個單元衝程到全像素行或列只是內部或所述形狀的 邊界外的 之一。

因此,如果您將節點留在沒有snapToPixel的組或區域中,則可以按照Shape文檔中的上述說明進行操作。

下面是一些示例代碼:

import javafx.application.Application; 
import javafx.scene.*; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Line; 
import javafx.scene.shape.LineBuilder; 
import javafx.scene.shape.StrokeType; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

/** http://stackoverflow.com/questions/11886230/how-to-draw-a-crisp-opaque-hairline-in-javafx-2-2 */ 
public class LineWidths extends Application { 
    public static void main(String[] args) { launch(args); } 

    @Override public void start(Stage stage) { 
    Line fuzzyline = LineBuilder.create() 
     .startX(5).startY(50) 
     .endX(90).endY(50) 
     .stroke(Color.BLACK).strokeWidth(1) 
     .build(); 
    Line hairline = LineBuilder.create() 
     .startX(4.5).startY(99.5) 
     .endX(89.5).endY(99.5) 
     .stroke(Color.BLACK).strokeWidth(1) 
     .build(); 
    Line fatline = LineBuilder.create() 
     .startX(5).startY(150) 
     .endX(90).endY(150) 
     .stroke(Color.BLACK).strokeWidth(1).strokeType(StrokeType.OUTSIDE) 
     .build(); 
    Pane snappedPane = new Pane(); 
    Line insideline = LineBuilder.create() 
     .startX(5).startY(25) 
     .endX(90).endY(25) 
     .stroke(Color.BLACK).strokeWidth(1) 
     .build(); 
    snappedPane.setSnapToPixel(true); 
    snappedPane.getChildren().add(insideline); 
    snappedPane.setPrefSize(100, 50); 
    snappedPane.relocate(-0.5, 174.5); 

    stage.setScene(
     new Scene(
     new Group(
      fuzzyline, hairline, fatline, snappedPane, 
      new Text(10, 40, "fuzzyline"), 
      new Text(10, 90, "hairline"), 
      new Text(10, 140, "fatline"), 
      new Text(10, 190, "snappedPane") 
     ), 100, 250 
    ) 
    ); 
    stage.show(); 
    } 
} 

Line Type Sample

+0

另見相關的問題:什麼是JavaFX中2線的確切尺寸(http://stackoverflow.com/questions/ 11881834 /什麼-是-A線-精確維度合JavaFX的2) – jewelsea 2012-08-10 18:37:12