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.

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 🙂

  • Creación y uso de la vista de un fragmento aunque no sea visible para el usuario
  • Vista personalizada como bloqueo / desbloqueo de la pantalla de Android
  • Eficiencia de diseño de Android, varias vistas o solo con vistas ocultas?
  • Problema onKeyDown ()
  • ¿Cuáles son los requisitos para una fuente (OTF o TTF) para que funcione bien en Android?
  • Refrescar una vista dentro de un fragmento
  • Estilizar un texto de edición de Android para que parezca un selector de lista desplegable / spinner
  • Android libvlc problemas de superficie múltiples
  • Android- cómo programar una vista entre las vistas en el diseño pre-cargado desde el XML?
  • Agregar mediante programación ABOVE a LayoutParams hace que la altura de la vista sea 0
  • ¿Por qué ButterKnife usa un DebouncingOnClickListener para los métodos de @OnClick?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.