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

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

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

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

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

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

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

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

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

Результаты одинаковы. Он возвращает нулевое значение.

Любые hinsts были бы высоко оценены, спасибо заранее.

Solutions Collecting From Web of "Как загрузить AnimationDrawable из xml-файла"

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" /> 

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

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

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

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

Нужно было более точно посмотреть на Resources.NotFoundException, и это getCause (), чтобы узнать, что не так 🙂

Это можно использовать для загрузки ресурсов из каталога «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"); }