2010-01-25 33 views
13

Tengo una clase personalizada BitmapStorage, no adjunta a ninguna vista o lo que sea, una de utilidad. Y tengo born_animation.xml archivo que contiene la animación <lista> con cuadros de animación:Cómo cargar AnimationDrawable desde el archivo xml

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

quiero cargar la animación del archivo XML como AnimationDrawable usando la clase de recursos (por lo que hacer todo el análisis para mí), extraer mapas de bits y ponerlos en mi clase de almacenamiento personalizada.

El problema que tengo:

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

WTF? ¿Puede alguien explicarme eso? El código compila bien. Todos los recursos están en su lugar.

Me trataron de otra manera - ImageView utilizar para hacer el análisis sintáctico (como se describe en la guía dev)

resultados son los mismos. devuelve el nulo dibujable.

Cualquier enrejado sería muy apreciado, gracias de antemano.

+0

no lo establezca como fondo - vea el ejemplo a continuación. –

Respuesta

6

Yay, he encontrado la causa! :)

era mi mal: yo no tenía el formato adecuado de mi archivo animation.xml:

  • yo no uso androide: espacio de nombres de atributos (por alguna razón decidí que no es requerido)
  • que elimina la "duración" atributo en <elemento> etiquetas

Después me fijo estas cosas res.getDrawable() empezaron a regresar una instancia AnimationDrawable correcta.

tuvieron que prestar más precisamente en Resources.NotFoundException y es getCause() para averiguar lo que está mal :)

26

Disponibles

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

Código:

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

Ver

<ImageView 
    android:id="@+id/progress_bar" 
    android:layout_alignParentRight="true" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/myprogress" /> 
+0

Hmm. Gracias, pero este es principalmente el código de la guía de desarrollo; esto no es lo que quiero. En realidad, la creación de ImageView es algo que no necesito, lo intenté como una solución alternativa. No lo mostraré en ningún lado. ¿Cómo puedo hacer eso sin ImageView? ¿Por qué la primera variante que probé (con res.getDrawable()) no funciona? – dimsuz

+1

Además, no puedo usar View.findViewById porque no tengo Vista, como he dicho, esta es una clase de utilidad. Imagine que tengo una biblioteca que no sabe nada acerca de Ver/Actividad. ¿No puede cargar recursos entonces?:) – dimsuz

+0

forma de terminar la actividad una vez que se complete? – RobinHood

3

Esto podría ser utilizado para cargar los recursos del directorio "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"); 
} 
Cuestiones relacionadas