Как загрузить 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");
}