Как загрузить AnimationDrawable из xml файла

У меня есть некоторый пользовательский класс BitmapStorage, не привязанный ни к одному виду, ни к другому - к утилите. И у меня есть файл born_animation.xml, который содержит < animation-list > с кадрами анимации:

<animation-list oneshot="true" >
    <item drawable="@drawable/frame01" />
    <item drawable="@drawable/frame02" />
</animation-list>

Я хочу загрузить анимацию из xml файла в качестве AnimationDrawable с использованием класса Resource (так что он будет делать все синтаксические разборки для меня), извлекать растровые изображения и помещать их в свой собственный класс хранения.

Проблема у меня:

Resources res = context.getResources(); 
AnimationDrawable drawable = (AnimationDrawable)res.getDrawable(R.drawable.born_animation); 
assertTrue( drawable != null ); <= fails! it null 

WTF? Может ли кто-нибудь объяснить мне это? Код компилируется отлично. Все ресурсы имеются.

Я попробовал другой способ - используйте ImageView для синтаксического анализа (как описано в руководстве dev)

ImageView view = new ImageView(context); 
view.setBackgroundResource(R.drawable.born_animation); 
AnimationDrawable drawable = (AnimationDrawable)view.getBackground(); 
assertTrue( drawable != null ); <= fails! it null 

Результаты совпадают. он возвращает нулевое значение.

Любые hinsts были бы очень благодарны, спасибо заранее.

Ответ 1

Да, я нашел причину!:)

Это было мое плохо: у меня не было надлежащего формата моего файла animation.xml:

  • Я не использовал android: namespace в атрибутах (по какой-то причине я решил, что это не требуется)
  • Я удалил атрибут "продолжительность" в <item> тэги

После того, как я исправил эти вещи, res.getDrawable() начал возвращать правильный экземпляр AnimationDrawable.

Пришлось более точно посмотреть на Resources.NotFoundException и getCause(), чтобы узнать, что не так:)

Ответ 2

Drawable

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"   
                android:id="@+id/myprogress" 
                android:oneshot="false">
    <item android:drawable="@drawable/progress1" android:duration="150" />
    <item android:drawable="@drawable/progress2" android:duration="150" />
    <item android:drawable="@drawable/progress3" android:duration="150" />
</animation-list> 

код:

ImageView progress = (ImageView)findViewById(R.id.progress_bar);
if (progress != null) {
    progress.setVisibility(View.VISIBLE);
    AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable();
    frameAnimation.setCallback(progress);
    frameAnimation.setVisible(true, true);
}

Вид

<ImageView
  android:id="@+id/progress_bar"
  android:layout_alignParentRight="true"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:src="@drawable/myprogress" />

Ответ 3

Это можно использовать для загрузки ресурсов из каталога "xml".

Drawable myDrawable;
Resources res = getResources();
try {
   myDrawable = Drawable.createFromXml(res, res.getXml(R.xml.my_drawable));
} catch (Exception ex) {
   Log.e("Error", "Exception loading drawable"); 
}