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

问题描述:

我有一个MapView,其上有各种标记。第一次进入MapActivity时,我在标记上设置了可绘制的边界,并且一切都很好。标记和阴影全部显示正确。但是当我点击另一个活动并返回时,阴影或标记不再正确绑定。有时只有一些标记受到影响。谁能告诉我这里发生了什么?这是一些代码。下面是我设置上的标记绘制边界:Android MapView标记阴影在活动恢复后移动

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仍然正确对齐。

另一个更新:我输出界限到日志,并看到界限在返回到地图屏幕后发生变化。当最初加入的标记物,其边界是:

[矩形(-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); 
} 
+0

我相信这个问题不在上面的代码中,如果没有更多的信息或更多的代码,将很难帮助你。如果问题仅出现在您触摸某个项目后才出现,则可能是您的onTap方法存在问题。您是否在触摸时更改绘图(即从正常状态变为选定状态或变焦状态)? – Luis

+0

除了打开一项新活动外,我在onTap方法上做得并不多。我在onTap()中注释了代码(以及它的各个部分),除非新的活动已启动,否则不会看到错误。我已经追踪了边界的变化,它是在离开新开始的活动并返回到地图屏幕之后。我猜想当返回到地图屏幕时会发生重绘,并且onTabsChange()会在tapped drawable(s)上被调用。 – broadbear

+0

你检查过你的简历方法吗?从活动返回后,您不需要读取标记(它们应该保留在内存中)。你在那里做任何事情可能会混乱吗?为了您的信息,我已经完成了几个从mapview调用活动的应用程序,但都没有显示这个问题。 – Luis

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

当我打开一个不同的活动时,该活动有一个ImageView,我正在填充相同的图像。原来,ImageView必须重置边界。我知道这是因为在重写draw()方法并设置每个绘图的边界之后,我不再能够在ImageView中看到图像。当我注释掉重写的draw()方法时,我能够在ImageView中看到图像,但是当我返回到地图时图像会移动。这告诉我,将图像添加到ImageView必须更新边界。

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

希望这可以帮助别人。我知道还有另一个关于*的问题,但是我找不到它来链接或回答。