Как загрузить AnimationDrawable из XML-файла - PullRequest
15 голосов
/ 26 января 2010

У меня есть некоторый пользовательский класс BitmapStorage, не привязанный ни к какому View или какому-либо другому - вспомогательному. И у меня есть файл 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 

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

Любые советы будут с благодарностью, заранее спасибо.

Ответы [ 3 ]

28 голосов
/ 26 января 2010

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);
}

View

<ImageView
  android:id="@+id/progress_bar"
  android:layout_alignParentRight="true"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:src="@drawable/myprogress" />
6 голосов
/ 26 января 2010

Я нашел причину! :)

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

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

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

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

3 голосов
/ 19 апреля 2012

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