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()イベントの後に再描画するだけです。何か案は?

更新:私は実際に理解しました。タップされたタイプの画像のみが移動し、影ではなく、移動する画像です。したがって、タイプ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);
}
4

1 に答える 1

0

問題が何であるかがわかりました。質問のコードからわかるように、InputStream から BitmapDrawables を読み込んでいます。無駄を減らすために、作成したすべての画像を flyweight に入れ、可能な場合はそれらを再利用します。つまり、マップに 3 つの「日差し」を配置すると、3 つすべてが同じイメージに基づいています。さらに、ItemizedOverlay を介してマップ上に配置するときは、boundCenterBottom() を呼び出して、影が正しい場所に表示されるようにします。

別のアクティビティを開くと、そのアクティビティには、同じ画像を入力していた ImageView があります。ImageView が境界をリセットしていたに違いないことが判明しました。これは、draw() メソッドをオーバーライドし、描画ごとに境界を設定した後、ImageViews で画像を表示できなくなったためです。オーバーライドされた draw() メソッドをコメント アウトすると、ImageViews で画像を表示できますが、マップに戻ると画像がずれています。これは、イメージを ImageView に追加すると境界が更新される必要があることを示しています。

私の解決策は、画像の種類ごとに 2 つの異なる画像を作成することです。1 つはマップ用、もう 1 つは他のアクティビティの ImageView 用です。それらを flyweight に入れることはできますが、それらには別々のキーがあるため、同じ画像に対して複数の画像インスタンスが存在する可能性があります。

これが誰かに役立つことを願っています。これについてStackOverflowの別の質問があったことは知っていますが、リンクしたり答えたりすることができません。

于 2012-10-08T20:34:06.653 に答える