2011-12-13 12 views
8

Sviluppo un widget basato su ViewGroup e il mio problema è che ho bisogno di salvare la posizione degli elementi dopo la fine dell'animazione. Ho chiamato setFillAfter(true) nel mio oggetto di animazione che ho creato AnimationListener e nella sua chiamata al metodo onAnimationEndView.layout(l,t,r,b) per impostare la posizione dopo l'animazione, perché voglio che l'animazione inizi dalla posizione del nuovo oggetto la prossima volta. Ma in questo caso sembra che gli oggetti siano disposti due volte. Se non utilizzo View.layout(l,t,r,b) alla fine dell'animazione, l'animazione successiva inizia dalla posizione precedente. Ecco il mio codice:Cambia posizione di visualizzazione dopo la fine dell'animazione

private void scrollUp() { 
    for(int i = 0; i < getChildCount(); i++) { 
     final View child = getChildAt(i); 
     final int index = i; 
     final int newleft = child.getLeft() + mOffsetBetweenItems; 
     final int newTop = child.getTop() - mOffsetBetweenItems; 
     TranslateAnimation scrollUp = new TranslateAnimation(0, mOffsetBetweenItems, 0, -mOffsetBetweenItems);   
     scrollUp.setDuration(1500); 
     scrollUp.setFillAfter(true);   
     scrollUp.setAnimationListener(
      new AnimationListener() { 

       @Override 
       public void onAnimationStart(Animation animation) {} 

       @Override 
       public void onAnimationRepeat(Animation animation) {} 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        child.layout(newleft, newTop, newleft + child.getMeasuredWidth(), newTop + child.getMeasuredHeight()); 
       } 
      } 
     ); 

     child.startAnimation(scrollUp); 
    } 
} 

Vi prego di darmi un consiglio come dovrei resettare la posizione della vista di conseguenza alla posizione finale dell'animazione?

+0

cambiando posizione significa che vuoi impostarlo in BOTTOM o TOP nel layout, vuoi così .. –

+0

non BOTTOM o TOP, ma in calcestruzzo X, coordinate Y che sono definite da 'view.lay out() 'metodo – teoREtik

risposta

12

L'ho fatto. Ecco il codice:

private void scrollUp() { 
    for(int i = 0; i < getChildCount(); i++) { 
     final View child = getChildAt(i); 
     final int index = i; 
     final int newleft = child.getLeft() + mOffsetBetweenItems; 
     final int newTop = child.getTop() - mOffsetBetweenItems; 
     TranslateAnimation scrollUp = new TranslateAnimation(0, mOffsetBetweenItems, 0, -mOffsetBetweenItems);   
     scrollUp.setDuration(1500); 
     scrollUp.setFillEnabled(true);   
     scrollUp.setAnimationListener(
      new AnimationListener() { 

       @Override 
       public void onAnimationStart(Animation animation) {} 

       @Override 
       public void onAnimationRepeat(Animation animation) {} 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        child.layout(newleft, newTop, newleft + child.getMeasuredWidth(), newTop + child.getMeasuredHeight()); 
       } 
      } 
     ); 

     child.startAnimation(scrollUp); 
    } 
} 

appena rimosso setFillAfter(true) e scrittura setFillEnabled(true) al posto di. Ma in questo caso non capisco la logica di setFillEnabled() funzionante, perché fornisce un comportamento non come descritto nella documentazione.

+0

Impostare la nuova sinistra su onAnimationEnd risolto i miei problemi. Grazie. Nel tuo codice, in quale momento mOffsetBetweenItems sarà impostato/aggiornato? – speedynomads

+0

Nota: non funziona su Lollipop almeno (indovinando a livello di API è stato incidentalmente implementato come sopra, ma non funziona sicuramente su Lollipop di sicuro) – MDragon00

0

Invertire l'animazione; Inizia dando una nuova posizione alla vista e quindi esegui l'animazione dalla posizione precedente alla nuova posizione.

+0

Se prendo una nuova posizione, per prima cosa ridisegna la mia vista in modo nuovo nella nuova posizione – teoREtik

+0

Non se si chiama startAnimation() non appena si cambia la posizione. – Jave

+0

Se chiamo 'View.layout()' prima di 'view.startAnimation()' ridisegna la mia vista e l'animazione parte dalla nuova posizione – teoREtik

19

È necessario utilizzare ObjectAnimator, funziona dal livello API 11. Cambia Visualizza la posizione automatica,

Ecco l'esempio

ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(mContent_container, "translationX", startX, endX); 
objectAnimator.setDuration(1000); 
objectAnimator.start(); 

Grazie luglio per il suo answer

Se l'applicazione non ha trovato object animator, modificare il livello di API da Project -> properties -> Android, oltre import android.animation.ObjectAnimator;

+0

Animazione della vista. Le coordinate di vista non vengono modificate con l'animatore di oggetti. – mertsimsek

Problemi correlati