2011-04-06 14 views
7

Tengo una vista de desplazamiento que contiene una vista personalizada. La vista personalizada es más grande que el área de la pantalla y dibuja correctamente.Optimizaciones de vista de desplazamiento

La vista de desplazamiento sin embargo tiende a llamar a OnDraw() sin parar cuando se desplaza, y parece que no puedo hacerlo sin problemas.

Utilicé ScrollView.getDrawingRect() para calcular la parte visible de la pantalla y solo dibujar a eso, pero todavía devuelve la vista completa (por lo que está optimizada para no dibujar áreas fuera de pantalla), y no el delta entre la última posición y la actual. Idealmente, me gustaría dibujar solo el delta, y no toda la ventana visible.

Si alguien me puede indicar más información sobre cómo usar los cachés de dibujo, y si eso ayuda a optimizar el desplazamiento, me encantaría implementarlo, o cualquier otra posible solución, sería muy apreciado.

Respuesta

5

Cuando se desplaza el contenido, toda la ventana gráfica debe volver a dibujarse porque se ha movido todo el contenido. No creo que haya que hacer nada para optimizar un ScrollView: si el desplazamiento es lento, el método de dibujo de su vista personalizada es demasiado lento.

Trate de evitar la creación de objetos en sus métodos de dibujo, que suele ser el principal culpable del bajo rendimiento del dibujo.

Editar: También la vista de desplazamiento podría desplazar rápidamente el viejo contenido hacia arriba o hacia abajo que todavía se dibuja en la pantalla, y luego solicitar un redibujado de solo la parte "nueva" de la pantalla. (solo se aplica a vistas opacas).

+0

Hay mejores soluciones, podría implementar mi propia memoria caché dibujando mi vista en un mapa de bits, y luego dibujar ese mapa de bits en Draw en lugar de volver a calcular mi vista. El almacenamiento en caché de la vista de Android debería poder hacer algo similar, y la documentación lo insinúa, pero nunca he visto algo que explique claramente el almacenamiento en caché de la vista. – HaMMeReD

+0

Ha echado un vistazo a http://groups.google.com/group/android-developers/browse_thread/thread/224457b8cb4e039c?pli=1. Pero estoy de acuerdo, el tema del caché de dibujo no está bien discutido. –

+0

Por ahora acabo de implementar la ruta del mapa de bits. En mi onDraw veo si hay un mapa de bits de caché, creo que sea del mismo tamaño que la vista si existe, luego de llamar a mi viejo onDraw con un lienzo que apunta al mapa de bits. Que en onDraw regular simplemente dibuja el mapa de bits. Es una compensación de memoria/rendimiento, pero estoy de acuerdo con eso aquí, ya que estas vistas no deberían ser demasiado grandes. Si no puede asignar el caché, puedo recurrir al dibujo directamente a la vista. – HaMMeReD

-1

Afaik the ScrollView establece un clip correcto en el lienzo que se muestra en la vista, por lo que solo tiene que dibujar lo que hay dentro de ese rect. También podría implementar mapas de bits de caché basados ​​en el tamaño del clip de recorte.

1

Me encontré con el mismo problema. Lo resolví usando la función setDrawingCacheEnabled(true). Al habilitar esta configuración, su vista de lienzo se almacenará en caché como mapa de bits, por lo que no tendrá que llamar al método de dibujo canvas cada vez que se llame al onDraw().

En el constructor de la vista personalizada, necesitará algo como esto:

public CustomView(Context context) { 
    setDrawingCacheEnabled(true); 
    drawnFlag = false; 
} 

En el método de onDraw, se necesita algo como esto:

public void onDraw(Canvas canvas) { 
    if (! drawnFlag) { 
     canvas.drawPath(...); 
     canvas.drawPath(...); 
     drawnFlag = true; 
    } 
} 

Ahora, el desplazamiento en esta vista personalizada debe ser suave ya que solo llamamos a los métodos de dibujo una vez.

+1

No sé por qué nadie votó su respuesta. ¡Funciona! @Andree –

Cuestiones relacionadas