Autore Topic: Flickering dopo animazione  (Letto 836 volte)

Offline noodles

  • Utente junior
  • **
  • Post: 130
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Sistema operativo:
    Mac OS X Snow Leopard
Flickering dopo animazione
« il: 18 Luglio 2011, 13:09:49 CEST »
0
Sto provando ad animare alcuni LinearLayout.
Un piccolo test che sto facendo è prendere una LinearLayout che ad ogni click su di esso, si sposta in basso di un numero di pixel pari alla sua altezza (100px).
Ok il codice è scritto è funziona. Ci sono però un paio di cose che non mi piacciono/tornano.

Alla fine dell'animazione, evento sollevato dall'AnimationListener, cambio il layout per modificare la sua posizione consistente al risultato dell'animazione.

questa è l'animazione applicata al click
Codice (Java): [Seleziona]
Animation anim = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 1.0f);
anim.setDuration(duration);
Interpolator inter = new DecelerateInterpolator(0.4f);
anim.setInterpolator(inter);

questa è la modifica della posizione del layout al fine di permettere il click su di esso anche dopo lo spostamento.
Codice (Java): [Seleziona]
public static void changeLayoutPosition(LinearLayout layout) {
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 100);
        params.topMargin = 100;
        layout.setLayoutParams(params);
        layout.requestLayout();
    }


PROBLEMA 1:
una volta terminata l'animazione e chiamato il metodo soprastante per aggiornare la sua posizione avviene un artefatto, un flick. Come il ridefinire la sua posizione determini sulla chiamata requestLayout() un'implicita invalidate() che ridisegna il LinearLayout, da qui il flickering. Il comportamento è corretto, ma questo flickering mi aspetto di non vederlo.


PROBLEMA 2:
ho provato ad inserire setFillAfter(true) nella configurazione dell'animazione, ma avviene una cosa inaspettata.
Dopo il requestLayout() il LinearLayout viene disegnato altri 100px più in basso, praticamente con y = 200 anziché 100, ma il suo layout invece si trova a y = 100 dove mi aspettavo fosse. Di questo ne ho la sicurazza in quanto il click viene appunto catturato nei secondi 100px e non sul LinearLayout disegnato a schermo. Comportamento assurdo che non capisco... perchè a regola l'animazione dovrebbe solo influenza la parte disegnata del LinearLayout, invece pare che qualcosa vada in conflitto nel determinare poi il topMargin in fase di disegno a seguito della requestLayout().  :-\

Potete darmi una mano a risolvere questo problema? Che in Android le animazioni fossero "bruttine" lo sapevo, ma non mi aspettavo fino a questo punto :D

Offline noodles

  • Utente junior
  • **
  • Post: 130
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Sistema operativo:
    Mac OS X Snow Leopard
Re:Flickering dopo animazione
« Risposta #1 il: 05 Agosto 2011, 21:41:46 CEST »
0
purtroppo non sono riuscito a levare questo effetto. Il requestLayout invalida le view quindi vengono ridisegnate da qui il brutto flickering.

Io ho risolto così: non richiedo un nuovo layout, ma lo nascondo e ne creo un'altro exnovo prima dell'animazione che nascondo, sapendo quale sarà la sua posizione finale. Al termini dell'animazione faccio lo swith, nascono quello vecchio e rendo visible quello nuovo. E così non vedo il flickering.  :-)

Offline noodles

  • Utente junior
  • **
  • Post: 130
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Sistema operativo:
    Mac OS X Snow Leopard
Re:Flickering dopo animazione
« Risposta #2 il: 05 Agosto 2011, 21:42:27 CEST »
0
Non metto il topic a risolto, perchè di fatto la mia è non è una vera soluzione, ma un workaround.

Offline capa89

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
Re:Flickering dopo animazione
« Risposta #3 il: 09 Agosto 2011, 16:48:58 CEST »
0
Ciao io avevo il tuo stesso problema su un caso leggermente diverso, avevo un relativelayout con dentro una serie di view (child), e quando alla fine dell'animazione eseguivo un updatePosition delle view queste "schizzavano" via del doppio rispetto a quanto stabilito dall'animazione (eg 200 invece di 100).

Io ho risolto cambiando prima la posizione delle view e immediatamente dopo eseguivo le animazioni con i delta opposti e cambiati di segno. (FromY=0 ToY=200 --> FromY= -200 ToY=0)

Se qualcuno ha una spiegazione scientifica di tutto ciò siamo tutt'orecchie :)