Autore Topic: comportamento inatteso di onAnimationEnd per realizzare una sequenza  (Letto 550 volte)

Offline nostromo

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG P500
  • Sistema operativo:
    W XP
Salve, nello sviluppo di un'app desidero animare in sequenza alcune immagini utilizzando la stessa animazione.
Uso quindi un AnimationListener agganciandolo all'animazione utilizzata sulle immagini, in modo da richiamare onAnimationEnd per lanciare l'animazione sull'immagine successiva della sequenza. Il problema  consiste nel fatto che pur avviandosi le animazioni sulle immagini successive nella sequenza, queste ripartono anche sulle precedenti.

In alcuni forum è riportato un funzionamento non corretto di onAnimationEnd (pare che venga richiamato prima che termini effettivamente l'animazione) ma non mi sembra collegato al problema che riscontro.

Ho semplificato il codice che genera tale comportamento in modo da avere due immagini animate attraverso una sequenza casuale che sceglie ad ogni step una o l'altra di esse.

Ho testato il codice con le API level 8.
Grazie in anticipo per i suggerimenti

Codice (Java): [Seleziona]
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         
        // crea una sequenza di 10 numeri casuali
        sequence = new int[10];
        for (int i = 0; i < 10; i++) {
              sequence[i] = rnd.nextInt(2)+1;
             }
       
        // richiama le due uniche ImageView dal layout
        image1 = (ImageView) findViewById(R.id.image1);
        image2 = (ImageView) findViewById(R.id.image2);
       
        // definisce una animazione che all'evento di onAnimationEnd richiama il metodo goNextAnim che lancia l'animazione successiva
        myanimation = new ScaleAnimation(0.4f,1.0f,0.4f,1.0f,ScaleAnimation.RELATIVE_TO_SELF,0.5f,ScaleAnimation.RELATIVE_TO_SELF,0.5f);
        myanimation.setFillAfter(true);
        myanimation.setDuration(3000);
        myanimation.setRepeatCount(0);
        myanimation.setStartOffset(500);
        myanimation.setAnimationListener(new AnimationListener() {
            public void onAnimationEnd(Animation _animation) {
                goNextAnim();
            }
            public void onAnimationRepeat(Animation _animation) {}
            public void onAnimationStart(Animation _animation) {}
            });
       
        // definisce l'inizio della sequenza e lancia la prima animazione
        sequence_num = -1;
        goNextAnim();
    }

    public void goNextAnim () {
       sequence_num++;
       if (sequence_num < 10) {
           switch (sequence[sequence_num])  {
                   case 1 : nextImageToAnimate = image1; break;
                   case 2 : nextImageToAnimate = image2; break;
                   default : break;
           }
            nextImageToAnimate.startAnimation(myanimation);
       }  
   }