【问题标题】:How to handle large amount of animated vector drawables?如何处理大量动画矢量绘图?
【发布时间】:2020-06-07 10:10:49
【问题描述】:

我正在制作一个中文字典应用程序,可以向用户显示汉字笔顺动画。我使用MakeMeAHanzi 作为源,可用于为笔画顺序动画生成动画 SVG。一个 SVG 对应一个汉字。使用相同的概念,我生成了动画矢量可绘制对象。

目前我的 android 应用程序包含 9000 多个动画矢量可绘制对象,并且构建需要很长时间。我也收到此错误,仅当我添加 9000 多个动画矢量可绘制对象时才会出现:

com.google.common.util.concurrent.SettableFuture@72771445[status=PENDING] 等待 10 分钟(加上 203200 纳秒延迟)

我考虑过使用 GIF 并从扩展文件中加载它,但我真的很想拥有分辨率独立的优势。我已经尝试从扩展文件中加载动画矢量可绘制对象,但似乎我无法从文件系统加载 .xml 作为可绘制对象,除非我将其预编译为二进制 XML,我认为这将是我最后的手段,因为我仍然由于我无法构建 APK(我可以从 APK 中提取预编译的二进制 XML),因此不确定如何实现这一点。

我想知道是否有更有效的方法来处理大量矢量绘图或其他替代方法来处理这种情况?谢谢。

【问题讨论】:

  • 我能问一下为什么你有这么多动画矢量绘图吗?你有超过 9000 个这样的事实有点代码味道。
  • 您可以尝试在您的项目中创建一个库模块,将这些资源放在库模块中,并让您的应用程序模块依赖于库模块。初始构建将花费您习惯的时间,但它可能有助于未来的构建。基本上,您希望构建系统不必经常弄乱这些资源。但是,除此之外,我将回应 asky 的问题:为什么您首先拥有 9000 多个动画矢量绘图?我们无法就“处理这种情况的其他替代方案”向您提供建议,除非您详细说明您将如何处理它们。
  • 我实际上正在制作一个显示笔顺动画的中文字典。我使用的源码来自MakeMeAHanzi,可用于为9000多个汉字创建动画SVG,一个字符一个SVG文件。因此,基于相同的想法,我生成了动画矢量可绘制对象,因为与 SVG 相比,android 在处理可绘制对象方面更有效。
  • @asky 我同意我的方法是有问题的。我仍在寻找合适的方法来处理它。
  • 您描述的用例似乎是拥有 9000 个 SVG 的好理由。可能没有办法减少这个数字并使应用程序达到其预期目的。我以前从未遇到过这个问题,所以我能想到的是,如果您希望用户只同时查看几个可绘制对象,您可以在运行时从 SVG 生成可绘制对象。我不知道一个好的库选择来做到这一点(许多 android svg 库似乎没有维护),所以这个选项最终可能不起作用。

标签: java android android-studio android-resources animatedvectordrawable


【解决方案1】:

我已经设法解决了编译时间长的问题,以防万一有人偶然发现这篇文章,我将在此处发布我的解决方案。

显然,9000+ AnimatedVectorDrawable 不是问题。问题是我使用Inline complex XML resources 方法来创建我的AnimatedVectorDrawable。在我的每个 AnimatedVectorDrawable 中都包含多个 VectorDrawablesObjectAnimators。这意味着即使只有 1 个 AnimatedVectorDrawable XML 文件,AAPT 工具也会为 VectorDrawables 和 ObjectAnimators 创建多个 XML,这也意味着我最终得到了 9000 多个 AnimatedVectorDrawables。这就是编译时间长的原因。

所以,我最终创建了 VectorDrawables,并创建了一个类来在运行时处理 ObjectAnimators。但是,为了实现这一点,我必须使用 Java 反射技术访问 VectorDrawable 中的私有 getTargetByName 函数,以获取 ObjectAnimators 的目标对象,并在线程中使用 VectorDrawable 的invalidateSelf 函数在运行时更新 VectorDrawable。

【讨论】:

    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多