property example android animation

example - spring animation android



Animaciones suaves para diseƱos pesados (5)

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 hacia afuera y otra que se desliza hacia adentro.

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 imágenes ayudará?

PD

Creo que puedo estar usando 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.


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


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 para animación


Otra solución sería renderizar sus vistas en superficies 3D y animarlas a través de OpenGL. Así es como Sony hace todas sus animaciones ingeniosas como se ve, por ejemplo, en su aplicación TimeScape.

Hay una publicación en el blog sobre eso.


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


A medida que reaccionas ante eventos táctiles, es probable que instales nuevas TranslateAnimations en tu 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. Implemente su propia animación de traducción estática y evite crear instancias 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 (int offset) y offsetTopAndBottom (int offset) en lugar de animaciones que rinden mucho mejor en dispositivos antiguos y Android 2.x y evita por completo la recolección de basura.