2011-12-13 21 views
8

Desarrollo un widget basado en ViewGroup y mi problema es que necesito guardar la posición de los elementos después del final de la animación. Llamé al setFillAfter(true) en mi objeto de animación Creé AnimationListener y en su método onAnimationEnd llamo View.layout(l,t,r,b) para establecer la posición después de la animación, porque quiero que la animación comience desde la posición del nuevo elemento la próxima vez. Pero en este caso, parece que los elementos se presentan dos veces. Si no uso View.layout(l,t,r,b) al final de la animación, la siguiente animación comienza desde la posición anterior. Aquí está mi código:Cambiar la posición de la vista después del final de la animación

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); 
    } 
} 

Por favor, dame un consejo de cómo debería restablecer la posición de vista de acuerdo a la posición final de la animación?

+0

cambiar posición significa que quiere establecerlo en FONDO o ARRIBA en el diseño, quiere que esto ... –

+0

no sea INFERIOR o ARRIBA, sino en coordenadas X, Y concretas que están definidas por 'view.lay out() 'método – teoREtik

Respuesta

12

Lo hice. Aquí está el código:

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); 
    } 
} 

acaba de quitar setFillAfter(true) y escriben en lugar de setFillEnabled(true). Pero en este caso no entiendo la lógica del funcionamiento de setFillEnabled(), ya que proporciona un comportamiento no similar al descrito en la documentación.

+0

Al configurar el nuevo elemento en onAnimationEnd solucionó mis problemas. Gracias. En su código, ¿en qué momento se establecerá/actualizará mOffsetBetweenItems? – speedynomads

+0

Nota: al menos no funciona en Lollipop (supongo que en cierto nivel de API se implementó incidentalmente como se indicó anteriormente, pero no funciona al menos en Lollipop) – MDragon00

0

Invierta su animación; Comience por darle a su vista una nueva posición y luego anímela desde la posición anterior a la nueva posición.

+0

Si le doy una nueva posición en primer lugar, está rediseñando mi vista inmediatamente en la nueva posición – teoREtik

+0

No si llama a startAnimation() tan pronto como haya cambiado la posición. – Jave

+0

Si llamo a 'View.layout() 'antes de' view.startAnimation() ', vuelve a dibujar mi vista y la animación comienza desde la nueva posición – teoREtik

19

Debe usar ObjectAnimator, funciona desde el nivel API 11. Cambia Ver posición automática,

aquí es el ejemplo

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

Gracias JUL su answer

Si no encuentra su aplicación object animator, cambiar el nivel de API desde Project -> properties -> Android, que import android.animation.ObjectAnimator;

+0

Anima la vista. Las coordenadas de vista no se cambian con el animador de objetos. – mertsimsek

Cuestiones relacionadas