草庐IT

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

coder 2023-12-23 原文

我正在为 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 的方式。

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

所以我尝试将所有形状转换为 <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 - 在处理 Android 模式时 svgs 的 loadShape 失败的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  5. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  6. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  7. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  8. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  9. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

  10. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

随机推荐