无效的可绘制标记动画矢量
我已经看遍了所有的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()
充气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' }