Question Comment charger AnimationDrawable à partir d'un fichier xml


J'ai une classe personnalisée BitmapStorage, non attachée à une vue ou autre - un utilitaire. Et j'ai un fichier born_animation.xml qui contient <animation-list> avec des cadres d'animation:

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

Je veux charger l'animation à partir du fichier xml en tant qu'animationDrawable en utilisant la classe Resources (elle ferait donc toute l'analyse pour moi), extraire les bitmaps et les placer dans ma classe de stockage personnalisée.

Le problème que j'ai:

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

WTF? Est-ce que quelqu'un peut m'expliquer ça? Le code compile bien. Toutes les ressources sont en place.

J'ai essayé une autre façon - utiliser ImageView pour faire l'analyse (comme décrit dans le guide de développement)

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

Les résultats sont les mêmes. il retourne le traitable nul.

Tout hinst serait grandement apprécié, merci d'avance.


13
2018-01-25 22:44


origine


Réponses:


Dessinable

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

Vue

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

28
2018-01-25 22:56



Oui, j'ai trouvé la cause! :)

C'était ma faute: je n'avais pas le bon format de mon fichier animation.xml:

  • Je n'ai pas utilisé Android: espace de noms dans les attributs (pour une raison quelconque, j'ai décidé que ce n'était pas nécessaire)
  • J'ai supprimé l'attribut "duration" dans les balises <item>

Après avoir corrigé ces problèmes, res.getDrawable () a commencé à renvoyer une instance AnimationDrawable correcte.

J'ai dû regarder plus précisément Resources.NotFoundException et getCause () pour découvrir ce qui ne va pas :)


6
2018-01-26 13:56



Cela pourrait être utilisé pour charger des ressources à partir du répertoire "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"); 
}

3
2018-04-19 14:14