Cómo azulejar y desplazar una imagen grande (10000×10000) en android

Estoy trabajando en un proyecto de mapa en android. Contiene una imagen más grande de 10000×10000 de resolución. Usando esta imagen con Bitmap da OutOfMemoryError . Así que quiero azulejar y desplazar esta imagen. Cuando se desplaza la imagen, sólo la pantalla visible debe tener azulejos y otros azulejos invisibles deben ser reciclados. Pasé mucho tiempo pero no encontré nada.

Cualquier ayuda será apreciada. Proporcionar mejores soluciones o ideas.

Según la recomendación de Dave, usted puede dividir la imagen en 1600 partes de 250x250px cada uno. Photoshop hace esto fácilmente en menos de un minuto ( aquí ). Usted no tiene que preocuparse por escribir el html usted también. Una vez que haya el html (permite llamar bigimage.html) y la carpeta de imágenes, coloque estos dos en su carpeta de activos y acceder a ellos de esta manera –

  setContentView(webView); try { webView.loadUrl("file:///android_asset/bigimage.html"; webView.getSettings().setLoadsImagesAutomatically(true); } catch (Exception e) { e.printStackTrace(); } 

A partir del nivel 10 de la API, puede utilizar BitmapRegionDecoder para cargar regiones específicas de una imagen sin necesidad de generar manualmente las imágenes de mosaico. Recientemente he desarrollado una lib que proporciona la visualización de imágenes grandes con el manejo de gestos táctiles. El código fuente y las muestras están disponibles en https://github.com/diegocarloslima/ByakuGallery

Alguien que conozco se topó con el mismo problema. Lo resolvieron primero dividiendo la imagen en cuadrados. A continuación, generan una página HTML que muestra las imágenes en un diseño <table> y obtienen el navegador incorporado para mostrar la página resultante. Esto significa que el navegador gestiona la visibilidad de las imágenes, y le da desplazamiento bidireccional y pinch-to-zoom.

Este enfoque es muy fácil de codificar, pero pierde la flexibilidad de escribir su propia solución personalizada. Esto era para una imagen más pequeña (2000×1500 ish) así que no estoy seguro cómo escalará a las dimensiones que usted necesita.

Si vas a esta ruta, asegúrate de tener border="0" cellpadding="0" cellspacing="0" en tu tabla y border="0" en las imágenes para asegurarte de que las combinaciones sean sin fisuras.

Compruebe la siguiente publicación en StackOverflow para obtener información sobre cómo solucionar el problema.

Usted puede azulejar su imagen en cuadrados azulejos (por ejemplo 256×256 px).

Puede subclase View y mantener el desplazamiento actual desde el centro [0,0] en las variables miembro.

En onDraw(Canvas) deberías dibujar las fichas que son visibles en base al offset actual (es fácil de calcular, que debe ser visible ya que sabes el desplazamiento de traducción actual, el tamaño de cada mosaico y el tamaño de la pantalla. Bitmaps en la Canvas .

Luego maneje onTouchEvent en su Actividad. Puedes manejar MotionEvent.ACTION_MOVE donde solo te MotionEvent.ACTION_MOVE por los mosaicos actualmente visibles, y luego en MotionEvent.ACTION_UP harías un repintado real e invocarías un hilo para buscar los nuevos azulejos (por lo que no harás una operación costosa En cada movimiento del dedo). Utilice el método invalidate() View para forzarlo a volver a pintar después de la panoramización.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.