在处理 Android 模式下 svgs 的 loadShape 失败

loadShape fails for svgs in processing Android mode

我正在为 android 开发一个动态壁纸应用程序,正在处理中。

当我将 loadShape 与某些 SVGs 一起使用时,它无法在 Android 模式下正确呈现。 但它在 java 模式下正确呈现。

这是一个这样的 svg kiwi.svg. It's being rendered like this.

但是 this svg 正在正确呈现Download orange.svg

我整理了这段简单的代码来演示我的意思。

PShape svg;
int num = 1;

String[] assets = {
  "tomato.svg", "ogears.svg", "watermelon.svg", "kiwi.svg"
};

void settings() {
  size(displayWidth, displayHeight, P3D);
}

void setup(){
  svg = loadShape(assets[num]);
}

void draw(){
  background(255);
  push();
  translate(svg.width/2, svg.height/2);
  scale(map(mouseY, 0, height, 0, 1));
  translate(-svg.width/2, -svg.height/2);
  ellipse(displayWidth/2, displayHeight/2, 200, 200);
  //translate(displayWidth/2, displayHeight/2);
  shape(svg);

  push();
  noFill();
  stroke(0);
  strokeWeight(10);
  rect(0, 0, svg.width, svg.height);
  pop();

  pop();
}

void push(){
  pushMatrix();
  pushStyle();
}

void pop(){
  popStyle();
  popMatrix();
}

void mousePressed(){
  num++;
  num = num % 4;
  svg = loadShape(assets[num]);
}

可在此处找到资产和完整代码。 SVGTests.zip

即使我使用像 size(.., .., P2D) 这样的 P2D 渲染器,它 也不 工作。

我猜我的 svg 与处理不兼容-android。

当我使用 this svg I get ArrayIndexOutOfBoundsException: 145 and the sketch dies. Download-it

所以我的问题是我应该去用 loadImage 替换我所有的 loadShape 用法并将我所有的 svg 转换为 png 格式而不是处理这个吗?

回答我的问题:

所以我注意到这两个 svg 之间的区别 the working one and the distorted one

差异是

  1. 工作 svg 中只有 <path> 个元素。
  2. non-working svg 有 <path><circle> 个元素。

Android-mode 渲染器无法正确渲染 <circle> svg 标签。

这是它呈现 svg 的方式。

需要注意的是,只有圆圈变形了(而不是它们应该在的地方)。

所以我尝试使用 Inkscape 将所有形状转换为 <path>s。它似乎可以正常工作,因为渲染器可以正确渲染 <path> 标签。

完成步骤:

  • 在 Inkscape 中打开 svg。如果需要,请备份旧版本,这是不可逆的。
  • CTRL+A select整个svg
  • Path > Object To Path CTRL+SHIFT+C
  • 立即保存文件。
  • 使用新文件重试。

性能:

我还观察到,在 java 和 android 模式下,将所有 circles 转换为 paths 后, loadShape 所花费的时间显着增加.

Java 渲染器(Windows 10 个)

name: kiwi-paths size: 917.71655 917.71655
time: 178.0 ms
name: kiwi-original size: 917.71655 917.71655
time: 74.0 ms

Android 渲染器(Android 7.0 Redmi note 4)

name: kiwi-paths size: 917.71655 917.71655
time: 190.0 ms
name: kiwi-original size: 917.71655 917.71655
time: 100.0 ms

所以如果运行在PC上没有有路径但有原始形状更好。

而且我还在 processing-android github 存储库中提交了 issue