GraphicsContext
JavaFX 在 a和高级Path
节点上提供了低级路径绘制方法。
我想将形状存储在类中并将它们绘制在GraphicsContext
. 这Path
门课对我来说似乎很方便。我知道,它旨在用作场景图中的节点,但它包含我需要的所有绘图元素。
我正在寻找一种方法,
GraphicsContext.fillPath(Path)
但没有。
我是否必须手动迭代Path
元素并将它们转换为低级GraphicsContext
方法,或者我错过了什么?
GraphicsContext
JavaFX 在 a和高级Path
节点上提供了低级路径绘制方法。
我想将形状存储在类中并将它们绘制在GraphicsContext
. 这Path
门课对我来说似乎很方便。我知道,它旨在用作场景图中的节点,但它包含我需要的所有绘图元素。
我正在寻找一种方法,
GraphicsContext.fillPath(Path)
但没有。
我是否必须手动迭代Path
元素并将它们转换为低级GraphicsContext
方法,或者我错过了什么?
我是否必须手动遍历 Path 元素并将它们转换为低级 GraphicsContext 方法?
是的。您将需要编写一个翻译器来获取从 a 中提取的数据Path
并调用适当的图形上下文方法(请参阅路径渲染方法),例如beginPath()
, moveTo()
, lineTo()
, closePath()
, fill
,stroke()
等。
而不是使用路径,您也许可以使用SVGPath
. 将 SVGPath 从场景图节点数据转换为 GraphicsContext 方法很容易 - 您可以这样做gc.appendSVGPath(svgPath.getContent())
。
我知道,它来的有点晚,但这是一个简单的通用解决方案......
由于Path
类是类型Node
,您可以使用Node.snapshot()
特定的方法Path
,然后将生成的传递WritableImage
给GraphicsContext.drawImage()
.
这是一个简单的代码片段如何实现这一点:
public void start(Stage primaryStage) {
Pane pane = new Pane();
Canvas canvas = new Canvas(70, 70);
GraphicsContext gc = canvas.getGraphicsContext2D();
pane.getChildren().add(canvas);
Scene scene = new Scene(pane, 70, 70);
primaryStage.setScene(scene);
Path path = new Path(
new MoveTo(10,10),
new LineTo(60,60),
new LineTo(60, 10),
new ClosePath());
path.setStroke(Color.BLACK);
path.setStrokeWidth(2.0);
Bounds pathBounds = path.getLayoutBounds();
WritableImage snapshot = new WritableImage(
(int) pathBounds.getWidth(), (int) pathBounds.getHeight());
SnapshotParameters snapshotParams = new SnapshotParameters();
snapshot = path.snapshot(snapshotParams, snapshot);
gc.drawImage(snapshot, pathBounds.getMinX(), pathBounds.getMinY());
primaryStage.show();
}