2013-02-22 4 views
16

Voici le code xml:Comment animer des images .gif dans un android?

<ImageView 
    android:id="@+id/imageView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/minepic" /> 

Ici, le minepic est une image animée gif, mais après l'exécution de l'application de son juste montrer une image statique.

Existe-t-il une solution sur la façon d'animer les images .gif dans une application Android?

+0

Voir: https://github.com/koral--/android-gif-drawable – kenorb

Répondre

14

Je recommande de ne pas utiliser Movie ou WebView des classes, mais au lieu ImageView avec une source ensemble drawable à animation-list. Regardez par exemple (mydrawable.xml):

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
android:oneshot="false"> 
<item android:drawable="@drawable/image_1" android:duration="100" /> 
<item android:drawable="@drawable/image_2" android:duration="100" /> 
<item android:drawable="@drawable/image_3" android:duration="100" /> 
</animation-list> 

// in your layout : <ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/my_drawable" /> 

De toute évidence, vous devez couper votre .gif en images séparées avant d'utiliser cette solution.

+2

Ne serait-ce besoin de trancher le gif au préalable? – Gjordis

+1

Oui, je suppose que c'est possible pour lui. – Piotr

+0

Dans le cas, il est certainement préférable d'approcher. Mais quand par exemple télécharger un gif et le montrer. Cela peut être un problème. – Gjordis

34

Pour donner une réponse précise et complète est ici ce que vous devez faire étape sage:

  1. Vous devez avoir différentes .png images qui serviront cadres pour votre animation. Enregistrez-les dans le dossier res/drawable.

  2. Créer un fichier anim.xml dans le dossier res/drawable avec le contenu suivant:

    <?xml version="1.0" encoding="utf-8"?> 
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
        android:oneshot="false"> 
    
        <item android:drawable="@drawable/image_3" android:duration="250" /> 
        <item android:drawable="@drawable/image_2" android:duration="250" /> 
        <item android:drawable="@drawable/image_1" android:duration="250" /> 
        <item android:drawable="@drawable/image" android:duration="250" /> 
    
    </animation-list> 
    
  3. Dans la mise en page fichier xml dans lequel vous souhaitez afficher l'animation:

    //... 
    <ImageView 
        android:id="@+id/iv_animation" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_centerHorizontal="true" 
        android:contentDescription="Animation" /> 
    //... 
    
  4. Dans le fichier Java qui charge le fichier XML de mise en page et appelle setContentView:

    //... 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    
        final ImageView animImageView = (ImageView) findViewById(R.id.iv_animation); 
        animImageView.setBackgroundResource(R.drawable.anim); 
        animImageView.post(new Runnable() { 
         @Override 
         public void run() { 
          AnimationDrawable frameAnimation = 
           (AnimationDrawable) animImageView.getBackground(); 
          frameAnimation.start(); 
         } 
        }); 
        // ... other code ... 
    } 
    // ... 
    

Pour arrêter l'animation que vous pouvez appeler .stop() sur le AnimationDrawable. Pour plus de détails sur les méthodes disponibles, vous pouvez consulter la documentation AnimationDrawable. J'espère que ça aide quelqu'un.

+1

Ceci est la solution complète et correcte. Thx – Sonhja

+0

Je ne sais pas pourquoi l'auteur n'a pas accepté cela. Cette solution est parfaite, merci. – gedo

+0

Grande réponse, mais une suggestion: vous n'avez pas à publier en tant que nouveau Runnable() car vous ne pouvez pas accéder à l'objet frameAnimation par la suite, par exemple. arrêter l'animation Voir l'exemple de code Google http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html –

0

Eh bien, j'ai pu animer des images Android en utilisant ce code simple:

canvas.drawColor(Color.WHITE); 
super.onDraw(canvas); 


long now=android.os.SystemClock.uptimeMillis(); 
System.out.println("now="+now); 
if (moviestart == 0) { // first time 
moviestart = now; 

} 

System.out.println("\tmoviestart="+moviestart); 
int relTime = (int)((now - moviestart) % movie.duration()) ; 
System.out.println("time="+relTime+"\treltime="+movie.duration()); 
movie.setTime(relTime); 
movie.draw(canvas,this.getWidth()/2-20,this.getHeight()/2-40); 
this.invalidate(); 
} 


il a été mis en œuvre facilement à l'aide MovieView

ou je peux je vous donner un tutorial pour ce genre de choses

0

Ce n'est pas une bonne pratique d'utiliser des Threads (ie View.post (new Runnable)) car la vue peut avoir changé pendant le dessin du dessinable (un cas utilise l'image animée sur ListView avec des éléments contenant des images de fond différentes), ce qui peut provoquer une exception ClassCastException si ImageView, par l'heure à laquelle le thread s'exécute possède un arrière-plan qui n'est pas une ressource animée.

ImageView loadingImg = (ImageView)v.findViewById(R.id.image); 
loadingImg.setBackgroundResource(R.drawable.progressdialog); 
loadingImg.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { 
    @Override 
    public void onViewAttachedToWindow(View v) { 
    AnimationDrawable loadingAnimation = (AnimationDrawable) v.getBackground(); 
    loadingAnimation.start(); 
    } 

    @Override 
    public void onViewDetachedFromWindow(View v) { 
    } 
}); 

Exemple montré here

4

Pour autant que je comprends, votre image GIF ne bouge pas, de sorte que le comportement est natif Android si vous traitez GIF comme une image statique. Pour moi, la meilleure solution (ne pas réinventer la roue!) Était la bibliothèque open-source gitDrawable. Vérifiez leur README, tout est très simple: ajoutez des dépendances à gradle et à utiliser (en XML ou en code). Exemple d'utilisation en Java:

GifDrawable gifFromResource = new GifDrawable(getResources(), R.drawable.anim);