在JavaFX中操作SVGPath

时间:2018-01-15 12:46:14

标签: java svg javafx

有没有办法检查/操纵SVGPath的元素?由于它不是源自Path(它是Shape的直接子类),因此无法通过PathElement Path获取getElements方法

(本质上,我想使用SVGPath作为SVG路径解析器,而不是必须包含Apache Batik或编写自己的。)

1 个答案:

答案 0 :(得分:2)

有一种简单的方法可以将SVGPath转换为Path,而不需要任何第三方依赖,正好基于它们的公共超类Shape的方法substract。可以将减法操作的结果下调到Path

Path path = (Path) (Shape.subtract(svgPath, new Rectangle(0, 0)));

因此给定了某个SVGPath,就像SVG logo的其中一段:

SVGPath svgPath = new SVGPath();
svgPath.setContent("M-84.1487,-15.8513 a22.4171,22.4171 0 1 0 0,31.7026 h168.2974 a22.4171,22.4171 0 1 0 0,-31.7026 Z");
svgPath.setFill(Color.TRANSPARENT);
svgPath.setStroke(Color.RED);

您可以轻松获取包含所有不同Path元素的PathElement

Path path = (Path)(Shape.subtract(svgPath, new Rectangle(0, 0)));
path.setFill(Color.TRANSPARENT);
path.setStroke(Color.BLACK);

并打印元素:

path.getElements().forEach(System.out::println);

具有以下结果:

MoveTo[x=-99.99996948242188, y=-22.91710090637207]
CubicCurveTo[x=-116.20481872558594, y=-16.20482063293457, controlX1=-105.8649673461914, controlY1=-22.91710090637207, controlX2=-111.72997283935547, controlY2=-20.67967414855957]
...
LineTo[x=83.94287872314453, y=16.351303100585938]
...
ClosePath

您现在可以操纵Path或其任何元素,但没有简单的方法从SVGPath获取新的Path

您可以在JFXtras project中找到ShapeConverter实用程序。有了它,您可以再次生成SVGPath:

SVGPath newSVGPath = ShapeConverter.shapeToSvgPath(path);