【问题标题】:loadShape fails for svgs in processing Android mode在处理 Android 模式下,svgs 的 loadShape 失败
【发布时间】:2019-07-22 12:05:51
【问题描述】:

我正在开发一款适用于 Android 的动态壁纸应用程序。

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

这是一个这样的 svg kiwi.svg。它被渲染为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 与 processing-android 不兼容。

当我使用this svg 时,我得到ArrayIndexOutOfBoundsException: 145 并且草图死了。 Download-it

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

【问题讨论】:

    标签: android processing


    【解决方案1】:

    回答我的问题:

    所以我注意到这两个 svgs the working onethe distorted one 之间的区别。

    区别是

    1. 工作 svg 中只有 <path> 元素。
    2. 非工作 svg 包含 <path><circle> 元素。

    Android 模式渲染器无法正确渲染<circle> svg 标签。

    这就是它渲染 svg 的方式。

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

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

    步骤:

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

    性能:

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

    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

    【讨论】:

      猜你喜欢
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2020-10-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多