JavaFX:如何在 GraphicsContext 上绘制路径?
JavaFX: How can a Path be painted on a GraphicsContext?
JavaFX 在 GraphicsContext
and a high-level Path
节点上提供两种低级路径绘制方法。
我想在 classes 中存储形状并在 GraphicsContext
中绘制它们。 Path
class 对我来说似乎很方便。我知道,它的意思是用作场景图中的节点,但它包含我需要的所有绘图元素。
我正在寻找类似的方法
GraphicsContext.fillPath(Path)
但是有 none.
我是否必须手动遍历 Path
元素并将它们转换为低级 GraphicsContext
方法,还是我遗漏了什么?
Do I have to iterate over the Path elements by hand and translate them into low-level GraphicsContext methods?
是的。您将需要编写一个翻译器来获取从 Path
and invoke appropriate graphics context methods (see the Path Rendering methods) 中提取的数据,例如 beginPath()
、moveTo()
、lineTo()
、closePath()
、fill
, stroke()
, 等等
与其使用路径,不如使用 SVGPath
. It is easy to translate an SVGPath from a Scene graph node data to a GraphicsContext method - you can just do gc.appendSVGPath(svgPath.getContent())
.
我知道,有点晚了,但这里有一个简单的通用解决方案...
由于 Path
class 是 Node
类型,您可以使用方法 Node.snapshot()
11=] 然后将生成的 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();
}
JavaFX 在 GraphicsContext
and a high-level Path
节点上提供两种低级路径绘制方法。
我想在 classes 中存储形状并在 GraphicsContext
中绘制它们。 Path
class 对我来说似乎很方便。我知道,它的意思是用作场景图中的节点,但它包含我需要的所有绘图元素。
我正在寻找类似的方法
GraphicsContext.fillPath(Path)
但是有 none.
我是否必须手动遍历 Path
元素并将它们转换为低级 GraphicsContext
方法,还是我遗漏了什么?
Do I have to iterate over the Path elements by hand and translate them into low-level GraphicsContext methods?
是的。您将需要编写一个翻译器来获取从 Path
and invoke appropriate graphics context methods (see the Path Rendering methods) 中提取的数据,例如 beginPath()
、moveTo()
、lineTo()
、closePath()
、fill
, stroke()
, 等等
与其使用路径,不如使用 SVGPath
. It is easy to translate an SVGPath from a Scene graph node data to a GraphicsContext method - you can just do gc.appendSVGPath(svgPath.getContent())
.
我知道,有点晚了,但这里有一个简单的通用解决方案...
由于 Path
class 是 Node
类型,您可以使用方法 Node.snapshot()
11=] 然后将生成的 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();
}