2010-09-13 9 views

Respuesta

9

Estoy bastante seguro de que esto es posible ya que puede cargar un archivo de mapa de bits realmente grande en un ImageView sin problemas, así que debe haber una forma incorporada de manejar grandes mapas de bits ... y después de unos pocos intentos , he encontrado una solución:

en lugar de cargar todo el mapa de bits y dibujar manualmente usted mismo, cargue como un lugar Drawable:

InputStream mapInput = getResources().openRawResource(
     R.drawable.transit_map); 
_map = Drawable.createFromStream(mapInput, "transit_map"); 

_map.setBounds(0, 0, _mapDimension.width(), _mapDimension.height()); 

estoy usando un archivo de recursos, pero ya que puede usar Drawable.createFromStream para cargar imágenes de cualquier InputStream, debería funcionar con mapa de bits arbitrario.

A continuación, utilice el método Drawable.draw para dibujar en el lienzo deseados de esta manera:

int left = -(int) contentOffset.x; 
int top = -(int) contentOffset.y; 
int right = (int) (zoom * _mapDimension.width() - contentOffset.x); 
int bottom = (int) (zoom * _mapDimension.height() - contentOffset.y); 

_map.setBounds(left, top, right, bottom); 
_map.draw(canvas); 

Como en el caso anterior, también se puede escalar y traducir el mapa de bits, así mediante la manipulación de los límites del dibujable y solo las partes relevantes del mapa de bits se cargarán y dibujarán en el Canvas.

El resultado es una vista de pellizco-zoomable desde un único archivo de mapa de bits de 200 KB. También probé esto con un archivo PNG de 22 MB y todavía funciona sin OutOfMemoryError, incluso cuando cambia la orientación de la pantalla.

+0

En su pregunta, indicó que la imagen no cabe en la memoria. Ha cambiado esto? –

+0

No, no tiene. Es un solo archivo PNG, todo el asunto. – chakrit

1

En términos generales, eso no es posible, especialmente porque la mayoría de los formatos de imagen están comprimidos, por lo que ni siquiera sabe qué bytes leer hasta que haya extraído la forma sin comprimir.

Divida su imagen en pequeños mosaicos y cargue solo los mosaicos que necesita para cubrir la región que desea visualizar en tiempo de ejecución. Para evitar el desplazamiento nervioso, es posible que también desee cargar las fichas que están fuera de la vista (las que bordean las fichas visibles) en una secuencia de fondo.

3

Se puede hacer fácilmente mediante el uso de RapidDecoder.

import rapid.decoder.BitmapDecoder; 

Rect bounds = new Rect(10, 20, 30, 40); 
Bitmap bitmap = BitmapDecoder.from("your-file.png") 
          .region(bounds) 
          .decode(); 
imageView.setImageBitmap(bitmap); 

Compatible con Android 2.2 (Nivel API 8).

Cuestiones relacionadas