2016-07-25 69 views
1

我看遍了所有的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

此外,我已經測試,而不是使用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版本。關於如何解決這個煩人的問題的任何想法?

更新: 我跟着Chris Banes博客,仍然沒有運氣。基本上,我已經更新了compat的圖書館23.4.0和我以前在我的活動如下:

static { 
    AppCompatDelegate.setCompatVectorFromSourcesEnabled(true); 
} 
+0

在你的錯誤中捕捉到我的眼睛的是「feedback.png」。這表明問題在於Android Studio將VectorDrawable轉換爲.png,然後導致失敗(無法爲png設置動畫)。在你之前的問題中,你的gradle文件中有適當的行來停止這個轉換(vectorDrawables.useSupportLibrary = true)。確保它仍然存在,並且沒有被意外刪除,並且還嘗試在項目上運行Clean和Rebuild以清除所有自動生成的文件。 –

+0

感謝@LewisMcGeary的評論。它在我的腦袋敲了整整一天後放棄之前就奏效了。因此,我將所有資源都放在了與主應用程序相關聯的模塊中。當我將動畫相關的XML移回到主應用程序時,加載工作正常,我能夠播放動畫。我仍然試圖理解它,因爲如果我擁有主應用程序中的資源而不是模塊的一部分,爲什麼它應該可以工作。我有一個答案後會發佈更新。 –

+0

奇怪的,但至少它的工作!我已經看到有人發佈由於應用程序中的資源與庫中的資源具有相同名稱而導致的問題。不確定它是否相關,但如果你解決了,請分享! –

回答

0

API 16 animation
充氣可繪製的

`VectorDrawable``AnimatedVectorDrawable`在此支持庫可以在充氣這種方式:

  • 調用靜態getDrawable()方法:
//This will only inflate a drawable with <vector> as the root element 
VectorDrawable.getDrawable(context, R.drawable.ic_arrow_vector); 

//This will only inflate a drawable with <animated-vector> as the root element 
AnimatedVectorDrawable.getDrawable(context, R.drawable.ic_arrow_to_menu_animated_vector); 

// This will inflate any drawable and will auto-fallback to the lollipop implementation on api 21+ devices 
ResourcesCompat.getDrawable(context, R.drawable.any_drawable);

如果膨脹在Java代碼中繪製對象,建議始終使用ResourcesCompat.getDrawable()因爲這樣處理棒棒糖回退時適用。這允許系統緩存Drawable ConstantState,因此效率更高。
圖書館有以下變形(雙向​​)動畫:

  • 播放,暫停變形動畫
  • 播放,停止變形動畫
  • 箭漢堡菜單變形動畫

  • ,你可以看,我製作了我的手機 API 16上面的圖片:

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

    看看GitHub的READMEvector-compat這裏:https://github.com/wnafee/vector-compat
    這將解決您的問題(低至API 14)如果你用它合併您的應用程序模塊的build.gradledependencies(通常在文件的結尾):

    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' 
    } 
    
    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()