Android:如何制作可点击的地图图像,每个国家/地区生成不同的动作?

时间:2010-10-18 16:15:16

标签: android image

我需要显示欧洲地图的漂亮图片,我想要我的应用,例如当用户点击每个国家/地区时,会显示不同的活动 - 地图上的每个国家/地区都需要具有不同的onClickListener(或等效内容)。

基本上,当用户点击法国而非西班牙时,我需要能够调用不同的函数,例如: http://commons.wikimedia.org/wiki/File:Blank_map_of_Europe_cropped.svg

我如何在Android上最好地解决这个问题?

我有想法,但可能有一些简单的方法,我忽略了。

非常感谢提前!

干杯, r3mo

4 个答案:

答案 0 :(得分:29)

以下是我解决类似问题的方法。

首先复制要用作图像映射的图像并为每个部分着色。不用说,每个部分的颜色不同:D。然后在布局中创建两个ImageView。将第一个的背景设置为要显示到屏幕的图像,将第二个的背景设置为彩色的一个。

然后将第二个ImageView的可见性设置为不可见。如果此时运行程序,您应该看到要显示的图像。然后使用OnTouch侦听器并获取您触摸的像素的颜色。颜色将与彩色图像的颜色相对应。

以下getColour方法需要传递touch事件的x和y坐标。 R.id.img2是不可见的图像。

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);
}

希望这对你有所帮助:)。

答案 1 :(得分:2)

我用像Scotty所说的面具做了这件事,但我遇到了更多问题。基本上,getPixel返回的颜色与掩码文件略有不同。我所做的是在禁用缩放的情况下将掩码加载到内存中,并使用如下全彩色选项:

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);

然后我从缩放的图像中查找了这样的坐标:

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();

然后我应用了mask.getPixel(origX,origY)。 它只适用于在ImageView中使用android:scaleType =“fitXY”缩放图像,否则coords会关闭。

答案 2 :(得分:2)

我没有尝试过,但this看起来很有希望。

我即将在我的项目中尝试它,我希望它适合你们。

这家伙基本上是试图通过捏缩放和拖拽来模仿机器人中的HTML Tag Map

答案 3 :(得分:1)

我遵循了clausundercover的答案,但仍然存在区域内像素颜色一致性的问题。最终对我有用的是确保我使用带有索引颜色的PNG图像作为蒙版。在我的情况下,我使用了Web优化调色板(216种颜色),并确保我选择的任何颜色都是该调色板中的值。一旦我做了这个改变,我在整个地区都得到了相同的颜色值。