mercoledì 5 gennaio 2011

Come utilizzare le animazioni in Android persistendo lo stato finale

Durante lo sviluppo della mia prima applicazione Android, mi sono scontrato con l'utilizzo delle classi dell'SDK riguardanti le animazioni.

Queste sono le classi principali da utilizzare:
  • AlphaAnimation nel caso si voglia agire sull'alpha channel di una view
  • RotateAnimation se si desidera ruotare una view
  • ScaleAnimation nel caso si voglia cambiare le dimensioni di una view 
  • TranslateAnimation se si vuole spostare una view 
  • AnimationSet è la classe che contiene più Animation (classe base delle classe appena citate) così da poter essere avviate contemporaneamente o con offset personalizzabili.

Tra i metodo più interessanti della classe Animation troviamo setFillAfter(boolean fillAfter). Se si passa al metodo il valore true, alla fine dell'animazione la view rimarrà nella suo stato finale (a secondo dei casi in una nuova posizione, con un nuovo alpha channel, una nuova rotazione o dimensione), altrimenti tornerà immediatamente nella suo stato originale.

Qui l'aspetto interessante che vorrei sottolineare. L'animazione va a cambiare SOLO la rappresentazione grafica della view sullo schermo ma NON cambia in nessun modo la reale gerarchia delle view!

Questo porta a importanti conseguenze. Immaginate infatti (come nel caso della mia applicazione) di aver creato un'animazione che sposta una EditText. Passando al metodo setFillAfter il valore true, abbiamo il risultato che l'EditText, una volta terminata l'animazione, rimane correttamente nella sua posizione finale. Ma tale posizione è solo una posizione fittizia sullo schermo. Se provassi ad entrare nell'EditText non ci riuscirei poichè in realtà l'EditBox è rimasta nella sua posizione originale. Infatti per poter accedervi sarebbe necessario toccare l'area dello schermo in cui la view era posizionata in origine.

Se dunque volete persistere la sua posizione al termine dell'animazione è necessario manipolare manualmente la gerarchia delle view, come ad esempio rimuovere al termine dell'animazione l'EditText dal Parent originale e aggiungerlo ad un nuovo Parent.

Esempio:

myAnimation.setAnimationListener(new AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
                }
              
                @Override
                public void onAnimationRepeat(Animation animation) {
                }
              
                @Override
                public void onAnimationEnd(Animation animation) {
                    myEditTextOldParent.removeView(myEditText);
                    myEditTextNewParent.addView(myEditText);
                }
            });

Se volete vedere un esempio concreto live scaricate la mia applicazione Mutuo Mobile:

Alla prossima!!


1 commento:

  1. Ciao Daniele,
    dopo essermi complimentato per la tua applicazione Mutuo Mobile Free, piccola ma graficamente molto intuitiva, aspetto con ansia l'aggiornamento che hai già annunciato.

    Bravo e ancora complimenti
    Mauro

    RispondiElimina