【问题标题】:Manipulating an SVGPath in JavaFX在 JavaFX 中操作 SVGPath
【发布时间】:2018-06-24 02:29:56
【问题描述】:

有没有办法检查/操作SVGPath 的元素?由于它不是从Path派生的(它是Shape的直接子类),我无法通过PathgetElements方法得到PathElements。

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

【问题讨论】:

    标签: java svg javafx


    【解决方案1】:

    有一种简单的方法可以将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);
    

    您可以轻松获得带有所有不同 PathElement 元素的 Path

    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 或其任何元素,但没有简单的方法从Path 中获取新的SVGPath

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

    SVGPath newSVGPath = ShapeConverter.shapeToSvgPath(path); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-21
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多