0

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

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() 事件之后的重绘。有任何想法吗?

更新:我实际上已经弄清楚,只有点击类型的图像会移动,而不是阴影,而是移动的图像。因此,在有 x 个 A 类型的图像和 y 个 B 类型的图像中,我点击任何 A 类型的图像,当我返回 MapActivity 时,所有 A 类型的图像都与其阴影未对齐,而所有类型的图像B 仍然正确对齐。

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

[矩形(-25, -48 - 25, 1)]

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

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

1 回答 1

0

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

当我打开一个不同的 Activity 时,该 Activity 有一个 ImageView,我用相同的图像填充。事实证明,那 ImageView 一定是在重置边界。我知道这一点是因为,在覆盖 draw() 方法并设置每次绘制的边界之后,我不再能够在 ImageViews 中看到图像。当我注释掉覆盖的 draw() 方法时,我可以在 ImageViews 中看到图像,但是当我返回地图时,图像会发生变化。这告诉我将图像添加到 ImageView 必须更新边界。

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

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

于 2012-10-08T20:34:06.653 回答