有没有一种方法可以检查/操纵SVGPath
的元素?由于它不是从Path
派生的(它是Shape
的直接子类),因此无法通过PathElement
的Path
方法获取getElements
。
(本质上,我想使用SVGPath
作为SVG路径解析器,而不是必须包含Apache Batik或自己编写)。
最佳答案
有一种简单的方法可以将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);