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?
Pour donner une réponse précise et complète, voici ce que vous devez faire étape par étape:
Vous auriez besoin d’images .png
différentes qui agiront comme des images Pour votre animation. Enregistrez-les dans le dossier res/drawable
.
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>
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" />
//...
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.
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.
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 );
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
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.
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