TransitionDrawable: invierte automáticamente la transición una vez que completa

Quiero añadir elementos ListView recién agregados con un efecto agradable. Pensé que era simple y fácil, pero me topé con un problema:

Quiero reproducir la animación de TransitionDrawable y una vez que termine – rebobinar. El nuevo elemento va a ser highlited por un momento, y luego se mezcla con el resto.

TransitionDrawable tiene métodos para reproducir animación hacia delante y hacia atrás, pero ninguno que pueda utilizarse para la sincronización. Esperaba una posibilidad para especificar una devolución de llamada para la terminación de animación, algo así como:

TransitionDrawable transition = (TransitionDrawable) view.getBackground(); transition.startTransition(500, new TransitionCompleteListener(){ public void completed() { transition.reverseTransition(500); } }); 

Pero nada como eso es compatible con la clase TransitionDrawable.

El problema es: ¿Cómo reproducir la animación TransitionDrawable, y cuando termina – inmediatamente jugar hacia atrás? Tuve la idea de usar la clase Timer para retrasar la ejecución de la parte hacia atrás de la animación, pero esta solución parece un poco demasiado pesada para una cosa tan simple.

O tal vez debería usar algo diferente que TransitionDrawable? Me gustaría evitar usar Animaciones de Propiedades, ya que quiero soportar dispositivos antiguos (y PA están disponibles desde Honeycomb).

Todavía no lo he probado, pero diría que lo que estás apuntando también podría ser posible con una animación antigua, una interpolación para ser más precisa. En lugar de manipular directamente el fondo dibujable (suponiendo que es lo que está haciendo actualmente), podría crear el mismo efecto cambiando la propiedad alfa de una vista que tiene exactamente las mismas dimensiones que el diseño de fila. A continuación, puede especificar la animación "normal" y su reverso en un solo AnimationSet y tener el último comienzo con un retardo basado en el primero. Alternativamente, Animation proporciona un AnimationListener al que puede conectarse y ser notificado cuando termina la primera animación, y posteriormente iniciar su reverse.

Observando el código fuente de TransitionDrawable, también veo algunas posibilidades de extender la implementación actual con una interfaz de escucha personalizada. No debería ser demasiado difícil de realizar realmente el patrón que ilustran en el fragmento de código en su pregunta.

Estoy un poco corto de tiempo ahora, así que dispara un comentario en caso de que necesite más punteros concretos (por ejemplo, fragmentos de código) – Voy a tratar de encontrar algún tiempo este fin de semana para ayudarle.

Tal vez usted podría intentar esto:

 Drawable[] transBack = new Drawable[] { res.getDrawable( R.drawable.ic_acept_blue ), res.getDrawable( R.drawable.ic_acept )}; ImageView btn = (ImageView) findViewById(R.id.resource); TransitionDrawable transitionAcept = new TransitionDrawable(transBack); btn.setImageDrawable(transitionAcept); btn.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch (event.getAction()) { case MotionEvent.ACTION_DOWN:{ TransitionDrawable transition = (TransitionDrawable) btn.getDrawable(); transition.startTransition(75); }break; case MotionEvent.ACTION_UP:{ TransitionDrawable transition = (TransitionDrawable) btnAcept.getDrawable(); transition.reverseTransition(75); v.performClick(); }break; default: break; } return true; } }); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //... DO Something here } }); 

El código anterior implementa un TouchListener para manejar la transición inversa y hacia adelante y un clickListener para manejar sus acciones. Es por eso que en MotionEvent.ACTION_UP llama a v.performClick(); Espero que esto te ayude.

He extendido la implementación de TransitionDrawable (en realidad copiado y modificado) para aceptar un parámetro repeatCount que indica cuántas veces hacer la transición adelante y atrás. Vea RepeatableTransitionDrawable en el repositorio a continuación.

También planeo agregar más de dos soportes desplegables.

https://github.com/mehmet6parmak/CustomDrawables

Intente con un manejador;)

 final TransitionDrawable transition = (TransitionDrawable) sizesSelectionLayout.getBackground(); int duration = 500; transition.startTransition(duration); new Handler().postDelayed(new Runnable() { @Override public void run() { transition.reverseTransition(duration); } }, duration); 

😉

Evaluar usando ViewAnimator en lugar de http://developer.android.com/reference/android/widget/ViewAnimator.html

El objeto de animación de entrada y salida conectado al ViewAnimator tiene un AnimationListener que activa el evento que desea capturar

  • Crear un botón en 3D en forma de android
  • Lollipop: dibuja detrás de StatusBar con su color puesto a transparente
  • GetHeight para View que tiene visibilidad = ido
  • Tamaños de iconos Android
  • ¿Por qué utilizar AsyncTaskLoader con LoaderManager, en lugar de Simple Handler?
  • 3 Puntos después de un texto que no encaja en el tamaño de vista de texto
  • ¿Cómo puedo obtener botones de acción con diseños personalizados para que se llamen como botones de acción estándar en Android 3.0+
  • Android DialogFragment Redimensionamiento automático
  • Diferencia entre MotionEvent.getRawX y MotionEvent.getX
  • Cambiar el color de fondo de ActionBarSherlock
  • Android: Actualización sobre el hilo de la interfaz de usuario muy rápido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.