什么是JavaFX的2.2画出一个清晰,不透明的发际线的最佳方式?
文档说,这与strokeWidth
的0.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();
您可以使用一个地区的子类,如面板为你的父母,拥有snapToPixel设置为true。
此外,参考节点的坐标系上的文档。
在该装置的像素级,整数坐标映射到所述角部和像素和像素的中心之间的裂纹出现在整数像素位置之间的中点。 因为所有的坐标值与浮点数指定,坐标可以精确地指向这些拐角(当浮点值具有准确的整数值)或以上的像素的任何位置。 例如,(0.5,0.5)坐标将指向舞台上的左上像素的中心。 类似地,在(0,0)与由10的10的尺寸的矩形会从舞台到10号的扫描线的第10像素的右下角上左上像素的左上角跨越。 该矩形内的最后一个像素的像素中心将在坐标(9.5,9.5)。
另见外形文档:
大多数节点往往有适用于他们仅整数翻译和他们往往使用整数坐标定义为好。 对于这种常见情形中,填充与直线边缘的形状的倾向,因为它们排队与落在整数设备坐标并因此倾向于自然覆盖整个像素的像素之间的裂缝是脆。 在另一方面,抚摸那些相同的形状通常会导致模糊的轮廓,因为默认抚摸属性同时指定默认笔划宽度是1.0坐标常常映射到正好1点装置中的像素,并且还使击球应该横跨形状的边界,在边界两侧下降一半。 因为在许多常见形状的边界倾向于直接落入整数坐标和那些整数坐标经常映射精确地为整数装置位置,边界趋于导致50%的覆盖率在像素的行和列上的形状的边界的任一侧而不是一个或另一个100%的覆盖率。 因此,可以填充通常是脆的,但招往往是模糊的。
两种常见的解决方案,以避免这些模糊轮廓是使用完全覆盖多个像素更宽招 - 典型地为2.0的笔划宽度将实现此,如果有有效无刻度变换 - 或指定任一StrokeType.INSIDE或StrokeType.OUTSIDE行程款式 - 这将偏置默认的单一单元冲程到全像素的行或列只是内部或形状的边框之外的一个。
所以,如果你离开你的节点在一个集团或者不snapToPixel地区,你可以按照从形状文件上面的指示。
下面是一些示例代码:
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();
}
}