web-dev-qa-db-fra.com

Comment animer des images .gif dans un android?

Voici le code pour xml:

<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 avoir exécuté l'application, il ne fait que montrer une image statique. 

Existe-t-il une solution pour animer les images .gif dans une application Android?

16
Danny

Pour donner une réponse précise et complète, voici ce que vous devez faire étape par étape:

  1. Vous auriez besoin d’images .png différentes qui agiront comme des images Pour votre animation. Enregistrez-les dans le dossier res/drawable.

  2. Créez le 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 le fichier de présentation 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, vous pouvez appeler .stop() sur la AnimationDrawable. Pour plus de détails sur les méthodes disponibles, vous pouvez voir AnimationDrawable documentation. J'espère que ça aide quelqu'un.

35
Shobhit Puri

Je ne recommanderais pas d'utiliser Movie ou WebView classes mais ImageView à la place avec la source pouvant être dessinée définie sur animation-list. Regardez l'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" />

Évidemment, vous devez découper votre .gif en images séparées avant d’utiliser cette solution. 

14
Piotr

Autant que je sache, votre image GIF ne bouge pas. C'est donc le comportement natif d'Android si vous traitez le GIF comme une image statique. Pour moi, la meilleure solution (ne pas réinventer la roue!) Était la bibliothèque open-source gitDrawable . Consultez leur fichier README, tout est très simple: ajoutez une dépendance pour graduer et utiliser (en XML ou en code). Exemple d'utilisation en Java:

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

Eh bien, j'ai pu animer des images Android à l'aide de 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 en utilisant movieview

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

0
dondondon
And i think this is the one way of solution by writing the anim-space.xml 
In which the slices of the image are added to the items one by one and setting that xml to the imageview of our layout xml.

http://developer.Android.com/reference/Android/graphics/drawable/AnimationDrawable.html

Dans ce lien développeurs, il est défini clairement.

0
Danny

Il n'est pas recommandé d'utiliser des threads (par exemple, View.post (nouveau Runnable)), car la vue peut avoir changé pendant le dessin du dessinable (l'un des cas utilise l'image animée sur ListView avec des éléments contenant différentes images d'arrière-plan) , ce qui peut provoquer une exception ClassCastException si ImageView, au moment de l’exécution du fil, a 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é ici

0
Carlos Barcellos