如何从xml文件加载AnimationDrawable

时间:2010-01-25 22:44:56

标签: android android-animation

我有一些自定义类BitmapStorage,没有附加到任何View或其他任何东西 - 一个实用程序。 我有born_animation.xml文件,其中包含< animation-list>动画帧:

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

我想使用Resources类从xml文件加载动画作为AnimationDrawable(所以它会为我做所有的解析),提取位图并将它们放到我的自定义存储类中。

我遇到的问题:

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 

结果是一样的。它返回null drawable。

在此之前,非常感谢任何展示。

3 个答案:

答案 0 :(得分:28)

绘制对象

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

答案 1 :(得分:6)

是的,我找到了原因! :)

这是我的坏事:我没有正确格式的animation.xml文件:

  • 我没有在属性中使用android:namespace(由于某种原因,我认为它不是必需的)
  • 我在&lt; item&gt;中删除了“duration”属性标签

我修复了这些东西后,res.getDrawable()开始返回一个正确的AnimationDrawable实例。

不得不更精确地查看Resources.NotFoundException并使用getCause()来查明错误:)

答案 2 :(得分: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"); 
}