为了账号安全,请及时绑定邮箱和手机立即绑定

Android:如何制作可点击的地图图像,并使每个国家/地区采取不同的行动?

Android:如何制作可点击的地图图像,并使每个国家/地区采取不同的行动?

慕慕森 2019-11-13 09:40:23
我需要显示一张欧洲地图的漂亮图像,并且我希望我的应用程序在用户单击每个国家/地区时(例如,带来不同的活动)-地图上的每个国家/地区都需要具有不同的onClickListener(或同等功能)。本质上,当用户在这样的图像中点击法国而不是西班牙时,我需要能够调用其他函数:http : //commons.wikimedia.org/wiki/File : Blank_map_of_Europe_cropped.svg我最好如何在Android上进行此操作?我有想法,但是可能有一些我忽略的简单方法。提前谢谢了!干杯,r3mo
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

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


首先复制要用作图像贴图的图像,然后为每个部分上色。不用说,每个部分都有不同的颜色:D。然后在布局中创建两个ImageView。将第一个的背景设置为要显示的图像,将第二个的背景设置为其中的彩色。


然后将第二个ImageView的可见性设置为invisible。如果此时运行该程序,则应该看到要显示的图像。然后使用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);

}

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


查看完整回答
反对 回复 2019-11-13
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

我像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”缩放图像时,此功能才有效,否则会关闭坐标。


查看完整回答
反对 回复 2019-11-13
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

在区域上像素颜色的一致性方面仍然存在问题。最终对我有用的是确保我使用带有索引颜色的PNG图像作为蒙版。在我的情况下,我使用了经过网络优化的调色板(216种颜色),并确保我选择的所有颜色都是该调色板中的值。进行此更改后,我在整个区域中获得了相同的颜色值。


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 604 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信