活动恢复后,Android MapView标记阴影会移动

时间:2012-09-23 18:14:17

标签: android android-mapview itemizedoverlay mapactivity

我有一个MapView,上面有各种标记。在第一次进入MapActivity时,我设置了标记上设置的drawable的边界,一切看起来都很好。标记和阴影都正确显示。但是当我点击另一个活动并返回时,阴影或标记不再正确绑定。有时它只是受影响的一些标记物。谁能告诉我这里发生了什么?这是一些代码。下面是我在标记drawable上设置边界的地方:

InputStream is = assetManager.open(imageName);
drawable = Drawable.createFromStream(is, null);
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
drawable.setBounds(-width / 2, -height, width - (width / 2), 0);

以下是我如何创建/添加叠加项目到地图:

GeoPoint point = createGeoPoint(lat, lon);
OverlayItem overlayItem = new OverlayItem(point, character.get_id(), "");
Drawable image = drawable;
overlayItem.setMarker(image);
itemizedOverlay.addOverlay(overlayItem);

据我所知,叠加层没有被重新添加到地图中,这只是在onResume()事件之后重绘。有什么想法吗?

更新:我实际上已经想到了,只有拍摄类型的图像移动,而不是阴影,而是移动的图像。因此,有类型A的x图像和类型B的y图像,我点击任何类型A的图像,当我返回MapActivity时,所有类型A的图像都与它们的阴影不对齐,而所有类型的图像B仍然正确对齐。

另一个更新:我正在输出日志的边界,并在返回到地图屏幕后看到边界正在改变。最初添加标记时,其边界为:

[Rect(-25,-48 - 25,1)]

但是当返回到地图屏幕时,界限已更改为:

[Rect(0,0-50,49)]

......为什么会这样?

又一次更新:我有一个解决方法......但我仍然想知道为什么会这样。解决方法是覆盖draw方法,并在调用draw方法时设置边界(到底部中心)。这是代码:

@Override
public void draw(Canvas canvas) {
  int dWidth = getIntrinsicWidth();
  int dHeight = getIntrinsicHeight();
  setBounds(-dWidth / 2, -dHeight, dWidth / 2, 0);
  super.draw(canvas);
}

1 个答案:

答案 0 :(得分:0)

我发现了问题所在。您可以从问题中的代码中看到,我正在从InputStream中读取BitmapDrawables。为了减少浪费,我将创建的所有图像放在一个flyweight中,并在可以的时候重复使用它们。这意味着,当我在地图上放置3个'sunshines'时,所有三个都基于相同的图像。另外,当我通过ItemizedOverlay将它们放在地图上时,我调用了boundCenterBottom(),因此阴影将显示在正确的位置。

当我打开另一个Activity时,该Activity有一个我使用相同图像填充的ImageView。事实证明,ImageView必须重置边界。我知道这是因为,在覆盖draw()方法并在每次绘制时设置边界后,我再也无法在ImageViews中看到图像了。当我注释掉覆盖的draw()方法时,我能够在ImageViews中看到图像,但是当我返回到地图时图像会被移动。这告诉我将图像添加到ImageView必须更新边界。

我的解决方案是为每种图像类型创建两个不同的图像;一个用于地图,另一个用于其他活动的ImageView。我仍然可以将它们放在flyweight中,但它们有单独的键,因此可以为同一图像存在多个图像实例。

希望这有助于某人。我知道StackOverflow还有另外一个关于此的问题,但我无法找到它链接或回答。