开发者

How to load AnimationDrawable from xml file

开发者 https://www.devze.com 2022-12-18 06:06 出处:网络
I have some custom class BitmapStorage, not attached to any View or whatever - an utility one. And I have born_animation.xml file which contains <animation-list> with animation frames:

I have some custom class BitmapStorage, not attached to any View or whatever - an utility one. And I have born_animation.xml file which contains <animation-list> with animation frames:

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

I want to load animation from xml file as an AnimationDrawable using Resources class (so it would do all the parsing 开发者_JS百科for me), extract Bitmaps and put them to my custom storage class.

The problem i have:

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

WTF? Can someone explain me that? Code compiles fine. All resources are in place.

I tried another way - use ImageView to do the parsing (like described in dev guide)

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

Results are the same. it returns the null drawable.

Any hinsts would be greatly appreciated, thanks in advance.


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> 

Code:

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


Yay, I found the cause! :)

It was my bad: I didn't had the proper format of my animation.xml file:

  • I didn't use android: namespace in attributes (for some reason i decided it's not required)
  • I deleted "duration" attribute in <item> tags

After I fixed these things res.getDrawable() started to return a correct AnimationDrawable instance.

Had to look more precisely at Resources.NotFoundException and it's getCause() to find out what's wrong :)


This could be used to load resources from the "xml" directory.

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号