我正在为 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 one和 the distorted one .
区别是
- 工作的 svg 只有
<path>
其中的元素。 - 非工作 svg 有
<path>
和<circle>
元素。
Android 模式渲染器无法渲染 <circle>
svg 标签正确。
这就是它呈现 svg 的方式。
需要注意的是,只有圆圈变形了(而不是它们应该在的地方)。
所以我尝试将所有形状转换为 <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/