在处理 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。
差异是
- 工作 svg 中只有
<path>
个元素。
- 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。
我正在为 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。
差异是
- 工作 svg 中只有
<path>
个元素。 - 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。