无效的可绘制标签:动画向量。

3
我在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)


我将使用与我的上一个问题相同的资源,您可以在此处找到Animated Vector Drawable not working with API 15

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

我一直在调试这个错误,它在以下语句失败:

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解析而不是使用兼容版本。有什么想法可以解决这个烦人的问题吗?

更新: 我按照Chris Banes的博客做了,但仍然没有运气。基本上,我已将兼容库更新为23.4.0,并在我的活动中使用了以下内容:

static {
    AppCompatDelegate.setCompatVectorFromSourcesEnabled(true);
}

1
在你的错误信息中,吸引我注意的是"feedback.png"。这让我想到问题可能出在Android Studio将VectorDrawable转换为.png格式,然后导致了失败(因为无法对png进行动画处理!)。在你之前的问题中,你在gradle文件中有适当的代码行来阻止这种转换(vectorDrawables.useSupportLibrary = true)。确保它仍然存在,并且没有被意外删除,同时尝试在项目上运行Clean和Rebuild以清除任何自动生成的文件。 - Lewis McGeary
1
感谢@LewisMcGeary的评论。经过一整天的苦思冥想和放弃前的挣扎,终于解决了问题。我把所有资源都放在一个模块中,该模块与主应用程序链接。当我把动画相关的XML文件移回主应用程序时,加载就正常工作了,我也能播放动画了。我仍在努力理解其中的道理,因为如果资源在主应用程序中而不是模块的一部分,为什么它会起作用呢?一旦我有答案,我会发布更新。 - Karim Fikani
有点奇怪,但至少它起作用了!我见过人们发布有关应用程序中的资源与库中的资源重名而导致问题的帖子。不确定是否相关,但如果你解决了,一定要分享! - Lewis McGeary
@LewisMcGeary,你可以将vectorDrawables.useSupportLibrary = true发布为这个特定问题的答案。因为它似乎正是那个问题,而这一行代码解决了我的问题。 - Bruno Bieri
2个回答

1
支持库版本号为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()

1

API 16 animation
可膨胀的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);
// 这将膨胀任何drawable,并会在api 21+设备上自动回退到lollipop实现 ResourcesCompat.getDrawable(context, R.drawable.any_drawable);

如果在java代码中膨胀Drawable,则建议始终使用ResourcesCompat.getDrawable(),因为它处理Lollipop回退(如果适用)。这允许系统缓存Drawable ConstantState,从而更有效率。
该库具有以下变形(双向)动画:

  • 播放-暂停动画
  • 播放-停止动画
  • 箭头-汉堡菜单变形动画

  • 正如您所见,我在我的API 16手机上生成了上面的图像:

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

    查看这里的 vector-compat 的github 自述文件(README)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'
    }
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接