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:

  • Codificar y decodificar objeto de mapa de bits en cadena base64 en Android
  • Obtener la zona horaria actual en la aplicación android
  • Hilos de aplicación vs Hilos de servicio
  • Barra de Acción de Android cómo agregar la biblioteca de apoyo v7 appcompat para Eclipse
  • ¿Cómo puedo crear un diseño deslizante, como el menú principal de Android?
  • Comprobar la aplicación de Android está en primer plano o no?
  •   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.

  • Android como puerta de enlace SIP a GSM
  • Android: No puedo tener ViewPager WRAP_CONTENT
  • Lenguajes de límite de Lint de Android para comprobar traducciones perdidas
  • Impedir que el teclado desaparezca en el botón de retroceso de Android
  • Cómo utilizar el último FFMPEG en el proyecto de estudio de Android?
  • FileProvider falla - npe intentando invocar XmlResourceParser en una cadena nula
  • 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.