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.
En su pregunta, indicó que la imagen no cabe en la memoria. Ha cambiado esto? –
No, no tiene. Es un solo archivo PNG, todo el asunto. – chakrit