2011-03-25 9 views
10

Mi aplicación utiliza TranslateAnimation android estándar para deslizar las vistas dentro y fuera de la pantalla. Desafortunadamente, el diseño parece ser bastante pesado: ImageView, un montón de vistas de texto y una galería con texto e imágenes. Hay dos vistas animadas: una que se desliza y otra que se desliza.Animaciones suaves para diseños pesados ​​

El problema está en el bajo rendimiento de estas animaciones, especialmente en los dispositivos con la CPU menos poderosa. Las animaciones no se ven lo suficientemente suaves.

Estoy pensando en eliminar TranslateAnimations y tratar de capturar los contenidos de la vista en un mapa de bits y moverlos como ImageViews.

¿Tiene alguna idea de cómo se deben realizar estas tareas correctamente y si el enfoque de movimiento de imagen ayudará?

P.S.

Creo que puedo estar utilizando animaciones de una manera incorrecta. Tengo dos vistas en FrameLayout. Uno es visible, el otro no. A continuación, administro eventos táctiles y aplico TranslateAnimations a ambas vistas (en ACTION_MOVE) mientras el usuario mueve el dedo por la pantalla. Por lo tanto, parece que el usuario mueve una vista fuera de la pantalla mientras tira de otra desde el lateral de la pantalla. Funciona bien para diseños livianos.

Respuesta

0

Finalmente logré implementar el comportamiento requerido usando la vista personalizada de Galería. Está funcionando perfecto ahora.

+0

La mejor solución es usar un selector de vistas basado en el código fuente de la aplicación de inicio de Android. http://marcreichelt.blogspot.com/2010/09/android-use-realviewswitcher-to-switch.html – basv

6

Debe habilitar la memoria caché de dibujo en las Vistas animadas. Mire la documentación para View.setDrawingCacheEnabled (boolean).

+0

He intentado ya que '\t \t Vista1 = (WeatherInfoView) findViewById (R.id.celda1); \t \t view2 = (WeatherInfoView) findViewById (R.id.cell2); \t \t view3 = (WeatherInfoView) findViewById (R.id.cell3); \t \t \t \t view1.setDrawingCacheEnabled (true); \t \t view2.setDrawingCacheEnabled (true); \t \t view3.setDrawingCacheEnabled (true); ' Desafortunadamente no veo ninguna diferencia con la memoria caché de dibujo activada – basv

0

Debe intentar usar flipper de visualización. Es muy simple incluir sus puntos de vista en él y usar archivos de animación para ejecutar numerosas animaciones. Este enlace puede ser útil:

viewFlipper for animation

+0

No es exactamente lo que quiero. Por lo que entiendo, ViewFlipper no permite deslizamiento de vista 'interactivo'. En mi aplicación, la vista sigue al dedo a medida que el usuario desliza las vistas. – basv

+0

Tampoco veo por qué el ViewFlipper debe ser más rápido que TranslateAnimations + –

1

Otra solución sería la de hacer que sus puntos de vista sobre superficies 3D y la animación de los a través de OpenGL. Así es como Sony hace todas sus animaciones ingeniosas como se ve, p. en su aplicación TimeScape.

Hay a blog post al respecto.

+0

PD: Supongo que esto es realmente muy rápido cuando se ejecuta en la GPU, que es el caso en los dispositivos Xperia. No estoy seguro de si los teléfonos Android anteriores harían eso en el software, en cuyo caso es incluso más lento. Aún así, puede valer la pena investigar, parece bastante sencillo. – Matthias

+2

El enlace ya no funciona. :( –

0

A medida que reacciona a los eventos táctiles, es probable que crea una instancia nueva TranslateAnimations en su método onTouch que se activa muy a menudo. La creación masiva de nuevas instancias genera una recolección masiva de basura.

2 soluciones:

  1. implementar su propio StaticTranslateAnimation y evitar instanciar en cada evento de movimiento (por ejemplo setTranslation (int x, int y)). Desventaja: este enfoque funcionó para mí solo para una sola animación. Animar dos objetos a la vez resultó nuevamente en la recolección de basura, aunque no se crearon instancias de ningún objeto (en mi código) durante el manejo del evento.

  2. Use offsetLeftAndRight (desplazamiento int) y offsetTopAndBottom (desplazamiento int) en lugar de animaciones que rinden mucho mejor en dispositivos antiguos y Android 2.x y evita la recolección de basura por completo.