Mostrar enormes imágenes en Android
Tengo la intención de mostrar imágenes muy grandes en Android.
Mi primera solución – para suministrarlos como pdf – falla porque no todas las computadoras portátiles tienen un visor de pdf preinstalado, y no quiero exigir a los usuarios que instalen uno.
- Android Webview goback () problema con el método loadDataWithBaseURL
- Surface - dequeueBuffer failed (Error desconocido 2147483646)
- El teclado de software redimensiona la imagen de fondo en Android
- Cómo hacer una rotación de imagen suave en Android?
- Cómo agregar cuadros a la imagen?
Así que tengo un png ahora (ancho = 3998px altura = 2827px) que quiero mostrar. He descargado esta imagen para probar cómo se mostraría la galería. Fue muy doloroso. Parece que la galería hace que esta imagen sólo una vez, y si me Zoom in, no puedo leer el texto en absoluto.
Así que escribí un testActivity que simplemente tiene un ImageView anidado en un LinearLayout. Puse la imagen en el dibujable y la fijo como imagen-fuente de ImageView. Unforunately la aplicación se bloquea inmediatamente, debido a un "
ERROR/AndroidRuntime(8906): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget"
No esperaba que una sola imagen pudiera ser demasiado grande para VM's memory
. He jugado un poco, establecer el tamaño de ImageViews
a 3998 & 2827px
, poner la imagen a sdCard
y leerlo manualmente con un fileInputStream
.
A mi gran sorpresa ahora muestra mi imagen, pero si doy vuelta a mi Nexus S horizontal consigo el mismo OutOfMemoryError
como antes.
¿Puede alguien me señalar la principal diferencia entre recibir un mapa de bits a través de un FileInputStream
o para establecerlo como fuente ImageView's
.
También no puedo desplazarme cómodamente con dos scrollViews
padre
Estoy buscando una solución simple para mostrar ONE large image
a la vez con la posibilidad de scroll horizontal and vertical
mientras que capaz de acercar y alejar.
Aquí hay una muestra de la imagen que quiero mostrar
- Android Ocultar barra de navegación / permanecer en modo inmersivo con la apariencia de teclado suave
- Actualizando ExpandableListView con notifyDataSetChanged ()
- Android - Animar el diálogo emergente con efecto de rebote
- Cómo obtener un Gesture View como en la aplicación oficial de Facebook
- Cómo iniciar una actividad desde la vista personalizada
- Cómo agregar vistas dentro de una vista personalizada?
- Spinner con ArrayAdapter personalizado para objetos que no muestran el elemento seleccionado
- Personalizar el indicador TabLayout. ¿Haciendo la esquina de la esquina del indicador de la pestaña?
Sé que es un viejo post, pero pasé mucho tiempo en este problema, así que aquí está mi solución.
Quería mostrar una imagen 2000 × 3000, pero me quedé sin memoria o la imagen era demasiado grande para ser mostrada.
Para empezar, obtengo las dimensiones de la imagen:
o = new BitmapFactory.Options(); o.inJustDecodeBounds=true; pictures = BitmapFactory.decodeStream(new FileInputStream(f), null, o);
Entonces lo corté en cuatro partes y las mostré con cuatro ImageViews. Intenté cargar la imagen completa y cortarla en cuatro (usando BitmapFactory.create(bitmap,int,int,int,int)
) pero salí de la memoria otra vez.
Así que decidí usar algunos BitMapRegionDecoder:
for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { ImageView iv = new ImageView(this); InputStream istream = null; try { istream = this.getContentResolver().openInputStream(Uri.fromFile(f)); } catch (FileNotFoundException e1) { e1.printStackTrace(); } BitmapRegionDecoder decoder = null; try { decoder = BitmapRegionDecoder.newInstance(istream, false); } catch (IOException e) { e.printStackTrace(); } int nw = (j*width/k); int nh = (i*height/k); Bitmap bMap = decoder.decodeRegion(new Rect(nw,nh, (nw+width/k),(nh+height/k)), null); iv.setImageBitmap(bMap); } }
Esto funcionó.
Sé que es una vieja pregunta pero utilicé TileView para hacer exactamente esto:
Intente utilizar éste: https://github.com/davemorrissey/subsampling-scale-image-view
Una vista de imagen personalizada para Android, diseñada para galerías de fotos y que muestra imágenes enormes (por ejemplo, mapas y planos de construcción) sin OutOfMemoryErrors. Incluye pinch to zoom, panning, rotación y soporte de animación, y permite una extensión fácil para que pueda agregar sus propias superposiciones y detección de eventos táctiles.
Puede utilizar esta fuente "fácil de integrar" de la aplicación WorldMap:
https://github.com/johnnylambada/WorldMap
Esto utiliza una imagen enorme de un mapa del mundo, y utiliza caché para mostrar un mapa.
Para integerate, acabo de copiar todos los archivos java (5 i guess) y utiliza el surfaceView en mi archivo de diseño. Luego pasé por el pequeño método OnCreate () de ImageViewerActivity.java y usé el código en mi actividad (con ligera alteración, dependiendo de mi uso personal).
Esta publicación es una buena demostración para ampliar una imagen mediante gestos multitáctiles. Utiliza Matrix para hacer zoom, así como panoramizar una imagen.
Esta respuesta debe resolverlo para u Extraño problema de memoria durante la carga de una imagen a un objeto Bitmap
Para manejar la escala, etc, y usar la resolución completa, puede usar MapView de OSM (mapa de calle abierta) y proporcionarle sus azulejos (en lugar del mapa). Compruebe esto: http://www.haakseth.com/?p=30
Tenemos que seguir los siguientes pasos para eliminar la excepción de memoria perdida al cargar imágenes enormes:
1. Read Bitmap Dimensions and Type 2. Load a Scaled down version into memory
La Guía para desarrolladores de Android define cómo lograrlos. aqui esta el link
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html#load-bitmap
- ¿Cómo se puede implementar multi-selección y Contextual ActionMode en ActionBarSherlock?
- Actividad muerta / onCreate llamada después de tomar la imagen a través de la intención