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

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


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


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

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

最佳答案

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

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

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

08-18 13:47
查看更多