如何处理大量的动画矢量可绘制对象?



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

目前我的安卓应用程序包含 9000+ 动画矢量可绘制对象,构建需要很长时间。我也收到此错误,仅在我添加 9000+ 动画矢量可绘制对象时发生:

等待 10 分钟(加上 203200 纳秒延迟(com.google.common.util.concurrent.SettableFuture@72771445[状态=挂起]

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

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

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

显然,9000+ AnimatedVectorDrawable不是问题所在。问题是我正在使用内联复杂的XML资源方法来创建我的AnimatedVectorDrawable。在我的每个AnimatedVectorDrawable内部都包含多个VectorDrawables和ObjectAnimators。这意味着即使只有 1 个 AnimatedVectorDrawable XML 文件,AAPT 工具也会为 VectorDrawables 和 ObjectAnimators 创建多个 XML,这也意味着我最终得到了超过 9000+ 个 AnimatedVectorDrawables。这就是编译时间过长的原因。

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

最新更新