Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: La posición de animación se restablece después de completada

Estoy usando una animación definida por xml para deslizar una vista de la pantalla. El problema es que, tan pronto como la animación se completa, se restablece a su posición original. Necesito saber cómo arreglar esto. Aquí está el xml:

<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator"> <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="500"/></set> 

Aquí está el Java que utilizo para llamarlo:

  homeScrn = (View)findViewById(R.id.homescreen); slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_left_out); //Set Click Listeners For Menu btnHelp.setOnClickListener(new OnClickListener() { public void onClick(View v) { LayoutInflater.from(getApplicationContext()).inflate(R.layout.help, (ViewGroup)findViewById(R.id.subpage), true); homeScrn.startAnimation(slideLeftOut); } }); 

Así que básicamente lo que sucede es inflar una vista debajo de uno. Luego animo la vista de arriba a la izquierda. Tan pronto como sale de la pantalla y la animación se ha terminado se restablece su posición de nuevo.

  • Evite los múltiples clics rápidos del botón
  • Establecer Toast Aparecer Longitud
  • Introducción a WiFi en Android
  • Android studio 1.5.1: No se pudo encontrar la propiedad 'vectorDrawables'
  • Nueva clase de reliquia no encontrada ... Ni siquiera uso reliquia nueva
  • Android Espresso - Haga clic en la casilla de verificación si no está marcada
  • Android SDK falta, está desactualizado o falta plantillas. Asegúrese de que está utilizando SDK versión 22 o posterior
  • Manejo de preferencias de Android sin cadenas mágicas
  • 7 Solutions collect form web for “Android: La posición de animación se restablece después de completada”

    Las animaciones funcionan como se esperaba. El hecho de que hayas animado algo no significa que lo hayas movido. Una animación sólo afecta a los píxeles dibujados durante la animación en sí, no a la configuración de los widgets.

    onAnimationEnd() agregar un AnimationListener , y en el método onAnimationEnd() , haga algo que haga que su movimiento sea permanente (por ejemplo, elimina la vista en la parte superior de su padre, marca la vista en la parte superior como la visibilidad GONE ).

    Finalmente conseguido una manera de trabajar alrededor, la manera derecha de hacer esto es setFillAfter(true) ,

    Si quieres definir tu animación en xml entonces deberías hacer algo como esto

     <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator" android:fillAfter="true"> <translate android:fromXDelta="0%" android:toXDelta="-100%" android:duration="1000"/> </set> 

    Usted puede ver que he definido filterAfter="true" en la etiqueta de set , si se intenta definir en la etiqueta de translate no funcionará, podría ser un error en el marco!

    Y luego en el Código

     Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide_out); someView.startAnimation(anim); 

    O

     TranslateAnimation animation = new TranslateAnimation(-90, 150, 0, 0); animation.setFillAfter(true); animation.setDuration(1800); someView.startAnimation(animation); 

    Entonces seguramente funcionará !!

    Ahora esto es un poco complicado, parece que la vista se mueve realmente a la nueva posición, pero en realidad los píxeles de la vista se mueven, es decir, su vista es en realidad en su posición inicial, pero no visible, se puede probar si tiene algún botón O clicable en su vista (en mi caso en el diseño), para arreglar que tiene que mover manualmente su vista / diseño a la nueva posición

     public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) new TranslateAnimation(-90, 150, 0, 0); 

    Ahora como podemos ver que nuestra animación comienza desde -90 x-axis hasta 150 x-axis

    Así que lo que hacemos está establecido

     someView.setAnimationListener(this); 

    y en

     public void onAnimationEnd(Animation animation) { someView.layout(150, 0, someView.getWidth() + 150, someView.getHeight()); } 

    Ahora permítanme explicar public void layout (int left, int top, int right, int botton)

    Mueve su disposición a la nueva posición primer argumento defina a la izquierda, que es 150 , porque la animación de la traducción ha animado nuestra opinión al eje x 150 , la tapa es 0 porque no hemos animado el eje y, ahora a la derecha hemos hecho someView.getWidth() + 150 básicamente obtenemos el ancho de nuestra vista y añadimos 150 porque nuestra izquierda se mueve ahora a 150 x eje para hacer que el ancho de la vista sea su origen, y el fondo es igual a la altura de nuestra vista .

    Espero que la gente entienda ahora el concepto de traducir, y todavía tiene cualquier pregunta que usted puede preguntar de inmediato en la sección de comentarios, siento placer ayudar 🙂

    EDIT No utilice el método layout() ya que puede ser llamado por el framework cuando la vista es invalidada y sus cambios no presist, use LayoutParams para establecer sus parámetros de diseño de acuerdo a su requerimiento

    Puedo ser un poco tarde en la respuesta, pero tengo la solución para esto:

    Sólo android:fillAfter=true añadir android:fillAfter=true en tu xml

    Puedes usar

     fillAfter=true fillEnabled=true 

    Su View no se restablecerá a la posición original, pero si tiene algunos botones o algo más en su punto de vista, su posición no cambiará.

    Debe utilizar ObjectAnimator , funciona desde el nivel API 11. Cambia la posición de la vista automática,

    Aquí está el ejemplo

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

    Gracias JUL por su respuesta

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

    Recuerdos Hayk

    Debe agregar este comando:

     final Animation animSlideLeft = new TranslateAnimation(0, -80, 0,-350, 0, 0, 0, 0); animSlideLeft.setFillAfter(true); 

    Fui a la misma pregunta y lo resolví con el ajuste del marginLeft en OnAnimationEnd ().

    MarginLayoutParams params = (MarginLayoutParams) this.getLayoutParams(); params.setMargins(this.getWidth()*position, 0,0,0); this.setLayoutParams(params);

    Este problema se ha molestado por más de una semana. Y la respuesta de Muhammad me señaló una manera directa de resolverlo.

    He utilizado sever layout para implementar menús laterales con animación. "View.layout no será persistente.Usted debe usar LayoutParams, que será persistente."

    Aquí está mi solución: (Utilice qué tipo de LayoutParameter depende del diseño de su propio padre):

     @Override public void onAnimationEnd(Animation animation) { FrameLayout.LayoutParams layoutParams=new FrameLayout.LayoutParams(screenWidth, screenHeight); layoutParams.setMargins((int) -(screenWidth * RATE), 0, (int) (screenWidth - screenWidth * RATE), screenHeight); for(View v:views) { v.setLayoutParams(layoutParams); //v.layout((int) -(screenWidth * RATE), 0, (int) (screenWidth - screenWidth * RATE), screenHeight); v.clearAnimation(); } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.