Sujet: Animations, Threads & Problemes

Bonsoir,

Je me heurte à un problème qui me laisse pantois.

En effet mon application tourne sur un seul thread. Lors de son exécution, des animations sont lancées (android.View.Animation).
Alors que je pensai que les animations étaient résolues par le même thread que celui s'occupant de l'exécution du programme, je me rend compte que pendant que l'animation s'exécute mon programme continue de travailler.
Seul problème si je sleep le programme pour attendre la fin de l'animation, l'animation est sleepée aussi puis reprend à la fin du sleep !

Ma question est : comment puis-je locker l'exécution principale du programme le temps que l'animation soit finie ?

Merci d'avance pour votre aide.

2

Re: Animations, Threads & Problemes

Bonsoir,
je n'ai pas encore joué avec les animations d'android, mais je trouve "anormal" de faire un sleep dans le thead UI.
Normalement, aucun traitement potentiellement long ne doit être fait dans ce thread, à fortiori un sleep !

A la fin du sleep, ton animation continue de façon fluide ? ou elle fait comme un "saut" ?
J'explique pourquoi cette question : en admetant que l'animation "tourne" sur un thread séparé et qu'elle continue à déplacer tes objets durant le sleep, ton thread Ui est de toute manière en pause : comment devrait-il faire pour "rafraichir" les views ?

En espérant que tu obtiendras une réponse plus précise que la mienne.

PS : ah oui je n'ai pas répondu du tout à ta question : Animation à une méthode setAnimationListener qui devrait t'intéresser.

Modifié pour la dernière fois par gfel (09/02/2010 18:21:31)

3

Re: Animations, Threads & Problemes

Oula, ne t'inquiètes pas, je ne suit pas fou au point de vouloir sleeper le Thread UI ^^.
Celui que je voulais sleeper c'était le main thread, n'exécutant pas les animations (puisque apparemment elles se résolvent dans un thread diffèrent)
Pour répondre à ta question, a la fin elle "saute".

Je connais déjà le AnimationListener avec ses méthodes, mais je n'ai pas encore réussi à trouver la combine me permettant de faire ce que souhaite avec ...

4

Re: Animations, Threads & Problemes

Je vais essayer d'être plus spécifique :

J'ai un moteur de jeu qui enclenche un certain nombre d'animations au même moment sur des objets d'un type à moi héritant d'ImageView.
Ce nombre peut être compris entre 0 et 9.

SI aucune animation n'est lancée, aucun soucis la suite du code est exécutée.
En revanche, si une ou plusieurs animations se sont lancées, mon moteur doit attendre la fin des animations pour poursuivre.

Mon problème se trouve là : comment mettre en attente le moteur le temps qu'une des animations passe par onAnimationEnd() pour le débloquer mais sans pour autant bloquer l' "animation visuelle" ?

5

Re: Animations, Threads & Problemes

Bon problème résolu, d'une manière immonde mais au moins ça marche :

Je lance dans mon moteur, après l'exécution de toutes mes animations, un Thread que je sleep aussitôt durant une période légèrement supérieure à celle de mes animations, puis ce thread lance dans le main Thread la suite du code.

Si quelqu'un à mieux a proposer je suis toujours preneur !

6

Re: Animations, Threads & Problemes

Viish a écrit:

Bon problème résolu, d'une manière immonde mais au moins ça marche :

+ 1

Le framework d'animations Android te propose de definir un AnimationListener pour gerer le debut/la fin ou la repetition de ton animation.

Ca se fait de cette maniere pour gerer la fin d'une animation :


package com.test.AnimationFwk;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.view.animation.Animation.AnimationListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

public class AnimationFwk extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        // Define a button and its layout
        Button b = new Button(this);
        b.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
       
        // Define an animation
        Animation a = new TranslateAnimation(0, 100, 0, 100);
        a.setDuration(3000);
        a.setAnimationListener(myAnimationListener);
        b.setAnimation(a);
       
        // Define the view
        LinearLayout ll = new LinearLayout(this);
        ll.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        ll.addView(b);
        setContentView(ll);

        // Start the animation
        a.start();
    }
   
    AnimationListener myAnimationListener = new AnimationListener(){

        public void onAnimationEnd(Animation arg0) {
            // TODO Auto-generated method stub
            AfterAnimationProc();
        }

        public void onAnimationRepeat(Animation arg0) {
            // TODO Auto-generated method stub
           
        }

        public void onAnimationStart(Animation arg0) {
            // TODO Auto-generated method stub
           
        }
       
    };
   
    public void AfterAnimationProc(){
        Log.e("AnimationFwk", "Do someting after animation !");
    }
}

Enjoy !

W

Note : Ce comportement d'abonnement a la fin d'une animation est exactement le meme dans le framework SL DotNet.

www.stuffbee.com