android - 在处理 Android 模式时 svgs 的 loadShape 失败

标签 android processing

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

当我将 loadShape 与某些 SVG 一起使用时,它无法在 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]);
}

可以在此处找到 Assets 和完整代码。 SVGTests.zip

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

我猜我的 svg 与 processing-android 不兼容。

当我使用 this 时svg 我得到 ArrayIndexOutOfBoundsException: 145 草图消失了。 Download-it

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

最佳答案

回答我的问题:

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

区别是

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

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

这就是它呈现 svg 的方式。

kiwi

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

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

实现步骤:

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

性能:

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

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 上运行,最好有路径但有原始形状。

我还提交了 issue在 processing-android github 仓库中。

关于android - 在处理 Android 模式时 svgs 的 loadShape 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57145711/

相关文章:

android - NoClassDefFoundError : android. support.design.internal.NavigationMenu on Android 4.2.2 (wiko)

java - 将 HashMap 迭代器转换为具体类型时出现 ClassCastException

javascript - 有没有办法更快地绘制数百个点(p5.js)

android - 在处理 IDE 上找不到 "Android mode"- Linux

c# - Xamarin.Forms:GroupHeaderTemplate 不可见,项目也不可见,但似乎部分呈现

Android Q - 从人像模式照片中获取深度图

android - 运行 map Activity 时应用程序崩溃

android - 无法在广播接收器中使用 Intent 过滤器列出应用程序

java - "Security settings have blocked a self-signed application from running"作为开发者

java - 挑战 token 错误