2012-05-04 12 views
10

Estoy usando SurfaceView para mostrar una imagen grande (generalmente más grande que la pantalla, pero no siempre) en una aplicación de Android. Se trata de gráficos realmente triviales, y es fácil implementar el desplazamiento utilizando OnTouchListener o GestureDetector. Los gráficos se ejecutan en un bucle Render, pero el rendimiento parece ser más que adecuado para todos los dispositivos reales (sin embargo, el emulador puede ser un poco molesto).Implementando Pellizcar y Zoom en Android SurfaceView

Estoy considerando implementar Pinch y Zoom en la imagen también, pero preferiría evitar tener que ir a OpenGL, ya que tengo muy poca experiencia con OpenGL y el uso de OpenGL me parece demasiado exagerado para algo tan simple .

Parece que la clase android.graphics.Camera podría permitirme implementar la funcionalidad de zoom que me gustaría.

¿Alguien sabe de algún buen ejemplo que muestre la implementación de una funcionalidad similar al pellizco y zoom en un SurfaceView básico de Android?

Además, si ha implementado algo como esto, ¿tiene alguna idea sobre el rendimiento? ¿Vale la pena la molestia adicional de OpenGL, dado que lo que se requiere aquí es tan simple?


es la pregunta claro aquí, o me estoy perdiendo algo de salta a la vista la documentación/código en el sitio de desarrolladores de Android que debería haber encontrado?

+0

También estoy buscando algo como esto. Obtuviste la solución ¿Puedes compartirlo? – Nir

+0

Lamentablemente, nada con lo que estoy realmente feliz. Por supuesto, es posible hacer un zoom de "fuerza bruta" (usando GestureDetector), pero no es una solución muy buena y puede requerir mucha memoria. –

+0

Hmm ... eche un vistazo a este tutorial: http://blahti.wordpress.com/2013/01/07/pan-zoom-examples-for-android/ Todavía no lo he comprobado, pero solo basado en un vistazo rápido, parece prometedor. –

Respuesta

3

OK - al haber tenido tiempo para realmente trabajar e investigar sobre esto durante algún tiempo, en realidad encontré una solución que resuelve el problema que tenía.

La solución se basa en BitmapRegionDecoder (API10 +). Lo que hace es permitir que la aplicación cargue en una parte de un mapa de bits, en lugar de intentar cargar todo el mapa de bits de una vez.

La esencia de la solución:

  1. Una versión de todo el mapa de bits muestrea se mantiene en la memoria. Debido a que esta versión está minimizada, se puede mantener allí permanentemente.
  2. Un subproceso se carga en la ventana gráfica actual (o un poco más) del mapa de bits a la memoria de forma continua (utilizando BitmapRegionDecoder). Como esto es, como mucho, un poco más grande que la pantalla, también debería quedar cómodamente en la memoria.
  3. El hilo de representación dibuja la versión adecuada para el lienzo; es decir, si está alejando o si el mapa de bits no está disponible (p. ej., porque se está cargando en segundo plano), se utiliza la versión reducida.
  4. Pan, Fling y Zoom se manejan con GestureListeners.

El crédito va a John Lombardo por la primera implementación de la idea que he encontrado.

I de código abierto mi propia aplicación junto con algunos de mis otras clases de utilidad en https://github.com/micabyte/android_game

Es una aplicación muy reciente, así que no tenían el bautismo de fuego de los usuarios reales en este momento. Sin embargo, he realizado pruebas con mapas de bits de 8000x4000 píxeles y hasta ahora no he tenido problemas. El rendimiento ciertamente parece adecuado para mis necesidades.

+0

Proyecto lib de IT – Dilip

0

Implementar pinch y zoom es algo que harías con una combinación del ScaleGestureDetector y la interfaz Canvas con una matriz de transformación. Querrá utilizar la misma matriz de transformación para manejar la escala y la traducción.

Cuestiones relacionadas