Android: ¿cómo hacer una imagen de mapa seleccionable con cada país produciendo una acción diferente?

Necesito mostrar una bonita imagen de un mapa de Europa, y quiero que mi aplicación, por ejemplo, muestre una actividad diferente, cuando el usuario haga clic en cada país; cada país en el mapa debe tener un OnClickListener diferente (o equivalente).

Esencialmente, necesito poder llamar a una función diferente cuando el usuario toca Francia en lugar de España en una imagen como esta: http://commons.wikimedia.org/wiki/File:Blank_map_of_Europe_cropped.svg

¿Cómo podría hacer esto en Android?

Tengo ideas, pero puede haber alguna manera simple que estoy pasando por alto.

¡Muchas gracias de antemano!

Saludos, r3mo

Así es como resolví un problema similar.

Primero, duplique la imagen que desea usar como mapa de imagen y coloree cada sección. No hace falta decir que un color diferente para cada sección: D. Luego crea dos ImageViews en tu diseño. Establezca el fondo de la primera como la imagen que desea mostrar en la pantalla y el fondo de la segunda como el color en una.

Luego configure la visibilidad del segundo ImageView en invisible. Si ejecuta el progtwig en este punto, debería ver la imagen que desea mostrar. Luego use un oyente OnTouch y obtenga el color del píxel donde tocó. El color se corresponderá con el de la imagen coloreada.

El siguiente método getColour necesitaría pasar las coordenadas xey del evento táctil. R.id.img2 es la imagen invisible.

private int getColour( int x, int y) { ImageView img = (ImageView) findViewById(R.id.img2); img.setDrawingCacheEnabled(true); Bitmap hotspots=Bitmap.createBitmap(img.getDrawingCache()); img.setDrawingCacheEnabled(false); return hotspots.getPixel(x, y); } 

Espero que esto haya sido de ayuda para ti :).

Lo hice con una máscara como lo indicó Scotty, pero me encontré con más problemas. Básicamente, los colores devueltos por getPixel eran ligeramente diferentes que en el archivo de máscara. Lo que hice fue cargar la máscara en la memoria con escalamiento desactivado y con opciones de color completo como esta:

 BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inTargetDensity = 1; bitmapOptions.inDensity = 1; bitmapOptions.inDither = false; bitmapOptions.inScaled = false; bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; mask = BitmapFactory.decodeResource(appContext.getResources(), resMask, bitmapOptions); 

Luego busqué las coords desde la imagen escalada de esta manera:

 ImageView map = (ImageView) findViewById(R.id.image); Drawable drawable = map.getDrawable(); Rect imageBounds = drawable.getBounds(); int scaledHeight = imageBounds.height(); int scaledWidth = imageBounds.width(); int scaledImageOffsetX = Math.round(event.getX()) - imageBounds.left; int scaledImageOffsetY = Math.round(event.getY()) - imageBounds.top; int origX = (scaledImageOffsetX * mask.getWidth() / scaledWidth); int origY = (scaledImageOffsetY * mask.getHeight() / scaledHeight); if(origX < 0) origX = 0; if(origY < 0) origY = 0; if(origX > mask.getWidth()) origX = mask.getWidth(); if(origY > mask.getHeight()) origY = mask.getHeight(); 

y luego apliqué mask.getPixel (origX, origY). Solo funciona cuando la imagen se escala con android: scaleType = “fitXY” dentro de ImageView; de lo contrario, las coords están desactivadas.

No lo he intentado, pero parece muy prometedor.

Estoy a punto de probarlo en mi proyecto, espero que funcione para ustedes.

Este chico básicamente está tratando de emular HTML Tag Map en droides con zoom y arrastre.

Seguí la respuesta de clausundercover pero todavía tenía problemas con la consistencia del color del píxel en una región. Lo que finalmente funcionó para mí es asegurarme de usar una imagen PNG con un color indexado para la máscara. En mi caso, utilicé la paleta optimizada para la web (216 colores) y me aseguré de que los colores elegidos fueran valores de esa paleta. Una vez que hice este cambio, obtuve el mismo valor de color en toda la región.