无效的可绘制标记动画矢量

我已经看遍了所有的stackoverflow,没有问题能够解决我的问题。

我试图播放一个带有API 15的设备上绘制的动画矢量,但我一直得到下面的运行时异常:

com.karim.test E/AvdcInflateDelegate: Exception while inflating <animated-vector> android.content.res.Resources$NotFoundException: File res/drawable-ldpi-v4/feedback.png from xml type xml resource ID #0x7f020066 at android.content.res.Resources.loadXmlResourceParser(Resources.java:2152) at android.content.res.Resources.loadXmlResourceParser(Resources.java:2107) at android.content.res.Resources.getXml(Resources.java:906) at android.support.graphics.drawable.VectorDrawableCompat.create(VectorDrawableCompat.java:408) at android.support.graphics.drawable.AnimatedVectorDrawableCompat.inflate(AnimatedVectorDrawableCompat.java:356) at android.support.graphics.drawable.AnimatedVectorDrawableCompat.createFromXmlInner(AnimatedVectorDrawableCompat.java:162) at android.support.v7.widget.AppCompatDrawableManager$AvdcInflateDelegate.createFromXmlInner(AppCompatDrawableManager.java:905) at android.support.v7.widget.AppCompatDrawableManager.loadDrawableFromDelegates(AppCompatDrawableManager.java:356) at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:197) at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:192) at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:66) at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:71) at com.karim.test.MainActivity.initialize(MainActivity.java:428) at com.karim.test.MainActivity.onCreate(MainActivity.java:210) Caused by: java.io.FileNotFoundException: Corrupt XML binary file at android.content.res.AssetManager.openXmlAssetNative(Native Method) at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:487) at android.content.res.Resources.loadXmlResourceParser(Resources.java:2134) at android.content.res.Resources.loadXmlResourceParser(Resources.java:2107) at android.content.res.Resources.getXml(Resources.java:906) at android.support.graphics.drawable.VectorDrawableCompat.create(VectorDrawableCompat.java:408) at android.support.graphics.drawable.AnimatedVectorDrawableCompat.inflate(AnimatedVectorDrawableCompat.java:356) at android.support.graphics.drawable.AnimatedVectorDrawableCompat.createFromXmlInner(AnimatedVectorDrawableCompat.java:162) at android.support.v7.widget.AppCompatDrawableManager$AvdcInflateDelegate.createFromXmlInner(AppCompatDrawableManager.java:905) at android.support.v7.widget.AppCompatDrawableManager.loadDrawableFromDelegates(AppCompatDrawableManager.java:356) at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:197) at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:192) at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:66) at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:71) at com.karim.test.MainActivity.initialize(MainActivity.java:428) at com.karim.test.MainActivity.onCreate(MainActivity.java:210) android.content.res.Resources$NotFoundException: File res/drawable/animated_feedback_left.xml from drawable resource ID #0x7f020065 at android.content.res.Resources.loadDrawable(Resources.java:1923) at android.content.res.Resources.getDrawable(Resources.java:664) at android.support.v7.widget.ResourcesWrapper.getDrawable(ResourcesWrapper.java:128) at android.support.v7.widget.TintResources.getDrawable(TintResources.java:45) at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:323) at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:201) at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:191) at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:66) at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:71) at com.karim.test.MainActivity.initialize(MainActivity.java:422) at com.karim.test.MainActivity.onCreate(MainActivity.java:204) Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag animated-vector at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:863) at android.graphics.drawable.Drawable.createFromXml(Drawable.java:804) at android.content.res.Resources.loadDrawable(Resources.java:1920) at android.content.res.Resources.getDrawable(Resources.java:664) at android.support.v7.widget.ResourcesWrapper.getDrawable(ResourcesWrapper.java:128) at android.support.v7.widget.TintResources.getDrawable(TintResources.java:45) at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:323) at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:201) at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:191) at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:66) at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:71) at com.karim.test.MainActivity.initialize(MainActivity.java:422) at com.karim.test.MainActivity.onCreate(MainActivity.java:204) 

我使用我以前的问题,你可以在这里找到相同的资源动画矢量绘制不与API 15工作

此外,我已经测试,而不是使用ImageView使用AppCompatImageView,但仍然是相同的错误。

我一直在调试这个错误,并在下面的语句失败:

 final XmlPullParser parser = res.getXml(resId); 

内:

 public static VectorDrawableCompat create(@NonNull Resources res, @DrawableRes int resId, @Nullable Theme theme) 

VectorDrawableCompat的方法23.3.0。

似乎我遇到了兼容性问题。 在某些时候,Android决定使用API​​ 15的XML解析,而不是使用compat版本。 关于如何解决这个烦人的问题的任何想法?

更新:我跟随克里斯·巴恩斯博客,仍然没有运气。 基本上我已经更新compat库到23.4.0,我在我的活动中使用了以下内容:

 static { AppCompatDelegate.setCompatVectorFromSourcesEnabled(true); } 

有支持库25.4.0,它的目的是解决我们所有的问题。 例如它最终支持路径变形!

要使用它,请添加:

 allprojects { repositories { maven { url "https://maven.google.com" } } } 

在您的项目gradle文件中,并相应地依赖于它本身:

 compile 'com.android.support:support-v4:25.4.0' 

之后,你可以用下面的方式(一点Kotlin代码)使用带有路径变形的矢量可绘制动画(这通常是“无效的可绘制标记动画矢量”背后的罪魁祸首):

 val drawable = AnimatedVectorDrawableCompat.create(this, R.drawable.vector_drawable) imageView.setImageDrawable(drawable) // You may use usual ImageView class, no Compat necessary. drawable.start() 

API 16动画
充气Drawable的

这个支持库中的`VectorDrawable``AnimatedVectorDrawable`可以用这种方式来夸大:

  • 调用静态getDrawable()方法:
  //这只会使用<vector>作为根元素膨胀一个drawable
 VectorDrawable.getDrawable(context,R.drawable.ic_arrow_vector);

 //这只会使用<animated-vector>作为根元素膨胀drawable
 AnimatedVectorDrawable.getDrawable(context,R.drawable.ic_arrow_to_menu_animated_vector);

 //这将膨胀任何可绘制的,并将自动回落到api 21+设备上的棒棒糖实现
 ResourcesCompat.getDrawable(context,R.drawable.any_drawable); 

如果在Java代码中绘制Drawable,则建议始终使用ResourcesCompat.getDrawable()因为这样可以处理棒棒堂回退。 这允许系统缓存Drawable ConstantState,因此效率更高。
该库有以下变形(双向​​)动画:

  • 播放 – 暂停变形动画
  • 播放停止变形动画
  • 箭头 – 汉堡菜单变形动画
  • 正如你所看到的,我在API 16手机上制作了上面的图片:

     import com.wnafee.vector.compat.AnimatedVectorDrawable; mdrawable = (AnimatedVectorDrawable) AnimatedVectorDrawable.getDrawable(this.getApplicationContext(), R.drawable.consolidated_animated_vector); 

    在这里查看vector-compat的github 自述文件 : https : //github.com/wnafee/vector-compat
    如果将它与应用程序模块的build.gradle dependencies (通常在文件末尾)合并,这将解决您的问题(直到API 14 ):

     dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) //Trying to FIX Binary XML file line #2: invalid drawable tag animated-vector compile 'com.android.support:appcompat-v7:25.0.0' compile 'com.android.support:design:25.0.0' //not needed // compile 'com.android.support:support-vector-drawable:25.0.0' compile 'com.wnafee:vector-compat:1.0.5'//*******holy grail *******https://github.com/wnafee/vector-compat // Failed to resolve: com.android.support:support-animated-vector-drawable:25.0.0 //not needed // compile 'com.android.support:support-animated-vector-drawable:25.0.0' }