Cómo animar la traducción de una vista

Al primer clic de un botón, quiero deslizar una View largo del eje x (por 200 píxeles a la derecha, digamos). Y en la segunda pulsación del botón, quiero deslizar la View hacia atrás a lo largo del eje x a su posición original.

El View.setTranslationX(float) salta la vista a las ubicaciones horizontales de destino con las llamadas myView.setTranslationX(200); Y myView.setTranslationX(0); respectivamente. ¿Alguien sabe cómo puedo deslizar la View a las ubicaciones horizontales objetivo en su lugar?

Nota 1: A TranslateAnimation no es bueno ya que realmente no mueve la View pero sólo presenta la ilusión de que se mueva.

Nota 2: No me di cuenta al momento de plantear la pregunta que los setTranslationX(float) y setTranslationY(float) se introdujeron a partir del nivel 11 de la API. Si apunta al nido de abeja (Nivel 11 API) hacia arriba, entonces Gautam La respuesta de K será suficiente. De lo contrario, vea mi respuesta para una solución sugerida.

3 Solutions collect form web for “Cómo animar la traducción de una vista”

Trate de mirar en ObjectAnimator y su clase superior Animador de Valor

Puede hacer algo como esto ObjectAnimator anim = ObjectAnimator.ofFloat(this, "translationX", 0,200); Y luego anim.start();

Utilizar un valor boolean y alternar con 200,0 en el animador de objetos para retroceder

PS: se puede usar el método setDuration para establecer cuánto tiempo debe durar la animación para completar

Editar:

Intente mirar la biblioteca de la ayuda que proporciona compatibilidad hacia atrás.

Editar

Como @AdilHussain señaló que hay una biblioteca llamada nineoldandroids que se pueden utilizar para el mismo propósito en los androides más antiguos.

Este me había stumped por unos pocos días justo (conseguir que funcione pre- Ice Cream Sandwich) pero creo que finalmente he llegado allí! (Gracias a Gautam K y Mike Israel por los clientes potenciales) Lo que hice al final fue extender mi View (un FrameLayout ) para iniciar las animaciones translate derecha / izquierda según sea necesario y escuchar el final de las animaciones para reubicar Mi FrameLayout derecha / izquierda según corresponda, de la siguiente manera:

 public class SlidingFrameLayout extends FrameLayout { private final int durationMilliseconds = 1000; private final int displacementPixels = 200; private boolean isInOriginalPosition = true; private boolean isSliding = false; public SlidingFrameLayout(Context context) { super(context); } public SlidingFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); } public SlidingFrameLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onAnimationEnd() { super.onAnimationEnd(); if (isInOriginalPosition) offsetLeftAndRight(displacementPixels); else offsetLeftAndRight(-displacementPixels); isSliding = false; isInOriginalPosition = !isInOriginalPosition; } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); // need this since otherwise this View jumps back to its original position // ignoring its displacement // when (re-)doing layout, eg when a fragment transaction is committed if (changed && !isInOriginalPosition) offsetLeftAndRight(displacementPixels); } public void toggleSlide() { // check whether frame layout is already sliding if (isSliding) return; // ignore request to slide if (isInOriginalPosition) startAnimation(new SlideRightAnimation()); else startAnimation(new SlideLeftAnimation()); isSliding = true; } private class SlideRightAnimation extends TranslateAnimation { public SlideRightAnimation() { super( Animation.ABSOLUTE, 0, Animation.ABSOLUTE, displacementPixels, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0); setDuration(durationMilliseconds); setFillAfter(false); } } private class SlideLeftAnimation extends TranslateAnimation { public SlideLeftAnimation() { super( Animation.ABSOLUTE, 0, Animation.ABSOLUTE, -displacementPixels, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0); setDuration(durationMilliseconds); setFillAfter(false); } } } 

Y, por último, para deslizar el SlidingFrameLayout derecha / izquierda, todo lo que tienes que hacer es llamar al método SlidingFrameLayout.toggleSlide() . Por supuesto que puede ajustar este SlidingFrameLayout para sus propósitos para deslizar un mayor número de píxeles, para deslizar por más tiempo, etc, pero esto debería ser suficiente para empezar 🙂

Tuve un problema similar, TranslateAnimation realmente mover la vista si usted llama setFillAfter ahora ( error android ). Tuve que hacer algo similar, así que he dicho, hey permite utilizar un oyente de animación y luego mover todo a la ubicación correcta. Desafortunadamente hay un fallo en los oyentes de la animación también ( solución del stackoverflow ). Así que creé mi propia clase de diseño de acuerdo a la solución en la solución stackoverflow y me fue bien ir 🙂

  • Android GridView de columna, anchura variable como la aplicación GooglePlus
  • Obtención de la función de vista modal en Android
  • Android Canvas OpenGL Renderer está sin memoria
  • Después de girar una línea lineal, los eventos onclick no cambian de posición después de la rotación
  • Posicionamiento de MediaController: vincular a VideoView
  • Agregar mediante programación ABOVE a LayoutParams hace que la altura de la vista sea 0
  • ListView con elementos triangulares
  • ¿Qué son WindowInsets?
  • Cómo agregar un marcador pin en la vista de la imagen en android
  • Estilizar un texto de edición de Android para que parezca un selector de lista desplegable / spinner
  • Cómo crear un estilo de aplicación de Twitter Acciones rápidas en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.