|
||
|
|
|
|||||||
| Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Necesidad de Idea Feliz. App consume demasiada memoria.
Soy nuevo en el tema de programación Android y por motivos ajenos a mi me toca desarrollar la parte de un proyecto de otra persona que lo ha abandonado.
La duda: - Tengo un mapa de españa dividido en provincias. - Cuando se pulsa encima del mapa recojo las coordenadas y ilumino la provincia correspondiente. La única manera que se me ha ocurrido es creando 50 imagenes a escala (cada una en un ImageView) de cada provincia (coloreada la provincia y fondo transparente) y al tener las coordenadas poner esa imageView en "VISIBLE" y el resto en "INVISIBLE". Ni que decir que peta en algunos dispositivos por el tema de la carga de memoria a parte de que me parece una solución muy pesada. - He probado ha hacer recycle() de bitmaps (pero al cargar 50 ImgeView sigue siendo demasiado). - Cambiar tamaño de imágenes ( pero solo cuando la calidad es pésima entonces funciona). ¿Alguna idea feliz? ^^ Un Saludo y gracias. P.D. Si hay algún manual de esto juro que no lo he encontrado, porque no se ni cuantas horas llevo con esta tontería. |
|
|
|
#2
|
||||
|
||||
|
Es una de grandes lacras de Android, la clase Bitmap consume demasiada memoria, y encima para colmo liberándola también es de las peores.
De todas formas una pregunta, ¿Sólo va a haber simultáneamente una provincia iluminada? Por ejemplo, si pulso en Murcia y después pulso en Madrid, ¿Murcia desaparece o se mantiene visible? Si es así, lo que tienes que hacer es crear la imagen cuando la pulsas, y si tienes alguna visible, liberarla. No tengas cosas en memoria cosas que no vas a usar, y menos aún si son imágenes. |
|
#3
|
||||
|
||||
|
Siguiendo la sugerencia de kriogeN, podrías hacerlo todo con al menos solo dos ImageView:
- un imageview que tenga la imagen de todo el país con todo apagado (un único PNG) - un imageview que cuando pulses en una provincia lo hagas invisible, le cambies el resource de referencia (la imagen), le modifiques la posición y lo hagas visible. Tener 50 imageviews también fastidia un poco al sistema de layouts de Android porque tiene que andar abriendo todos, calculando las posiciones, etc. P.D: Luego hay otra forma, el código se complica un poco si nunca has trabajado con Canvas, pero sería la forma de hacerlo "para nota": usando máscaras. No sé si lo del reconocimiento de la provincia lo habrás hecho también, pero ten en cuenta que las provincias no son rectangulares... La idea a grandes rasgos es tener dos PNG de España, uno con todo apagado y otro donde cada provincia está pintada de un color distinto. Sabiendo dónde se hace click en el mapa se puede consultar en el "mapa de colores" qué color es esa posición y así sabes rápidamente la provincia (evidentemente tendrás que hacerte la lista de los 50 colores que has usado). ¿Y cómo la iluminas? Pues ahí viene la magia de las máscaras, se puede pintar lo que quieras aplicando como máscara el mapa de colores de modo que solo se pinte (con el color que uses para iluminar) en la provincia que tiene cierto color del mapa de colores. P.D.2: Como curiosidad, si fuera para una página web, la alternativa sería hacerlo vectorial, de hecho por internet hay mapas de España en SVG y javascript, pero Android con SVG no se lleva bien... aunque sería una forma elegante también y te quitas de un plumazo todas las imágenes a costa de provincias menos definidas y más trabajo de modelado.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Última edición por mocelet Día 21/05/13 a las 11:18:01. |
|
#4
|
||||
|
||||
|
Muchas gracias a los dos por responder.
Efectivamente, la idea es si ilumino una provincia la otra la apago. kriogeN, toda la razón con los bitmaps. Me costo dios y ayuda entender porque la app petaba (antes de saber de las limitaciones de memoria). Al final a las 7 de la mañana conseguí que funcionara tal y como comentas mocelet. 2 ImageView, uno fijo (fondo) y el otro que voy cambiándole la imagen que le referencio y asignandole a un bitmapdrawable a la vez que reciclo. Eso si, creo que esa parte tiene mas instrucciones log.i que demás código XD, para ver por donde me salia. Funcionaba con 3 provincias, hoy me pongo con el resto a ver si no explota. La idea de dos imágenes y según el color del pixel seleccionado usar una mascara me parece genial (es mas, cuando tenga tiempo lo implementare), pero solo llevo un mes programando para android (yo hacía la parte web) y me corre mas prisa acabar esta parte y ponerme con la BBDD y los webservices. Ya os iré diciendo algo. Gracias ^^ Última edición por Exarkhun Día 21/05/13 a las 16:34:02. |
|
#5
|
||||
|
||||
|
Bueno sólo escribo de nuevo para decir que funciona.
Capturo el pixel que se pulsa y comparo cada imagen de cada provincia con el color del pixel. Lo he montado todo con un imageview al cual re voy cambiando la imagen con "setImageResource" y creando cada vez un bitmapdrawable, el cual reciclo si no es el adecuado. Ahora a por los webservices, y os asaltare con mas dudas. Mil Gracias. ^^ |
|
#6
|
||||
|
||||
|
No sé si era exactamente lo que habíamos comentado, pero si ya lo tienes y funciona bienvenido es. Saludos
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
|
![]() |
Estás aquí
|
||||||
|
||||||