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.
- ¿Cómo puedo cambiar colores en mi StateListDrawable?
- ¿Es posible que una actividad obtenga basura recopilada y no un fragmento de niño?
- Shared Toast no se muestra en Android 3.0.1 en Motorola Xoom
- Actualizar la interfaz de usuario desde un AsyncTaskLoader
- Estilo de elemento de menú Arc como en la aplicación tumblr para Android
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).
- Cómo probar la aplicación empresarial android en varios dispositivos
- Patrón de interfaz de usuario de las acciones rápidas de Android
- IPhone como cabezal deslizante, o: ¿cómo forzar el redibujo inmediato en el cambio de margen superior?
- Mostrar AlertDialog en cualquier posición de la pantalla
- Android- ¿Cómo diferenciar los diseños de Galaxy S-3 y Galaxy S-4?
- Conceptos básicos de Android: ejecutar código en el subproceso de la interfaz de usuario
- Cambiar el contenido de la vista de la actividad dinámicamente
- Creación de vistas dentro de un hilo de trabajo
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.
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
- Android FaceBook nuevoMyFriendsRequest devuelve EMPTY lista de amigos
- Mantenerte actualizado con las revisiones de la Biblioteca de soporte técnico de Android