2

たくさんのマーカーが付いた地図を表示するアプリを書いています。マーカーを動的にする (動的コンテンツを表示する) 必要があります。マーカーの内容は動的であるため、各マーカーのサイズは異なります。

これは、「さまざまな状態に対してさまざまなマーカーを返すことができます。さまざまなマーカーはさまざまな境界を持つことができます」というドキュメントでこれを見つけました。ここ: https://developers.google.com/maps/documentation/android/reference/com/google/android/maps/OverlayItem#getMarker(int)

これは、同じオーバーレイ上の複数のマーカーが異なるサイズになる可能性があることを意味すると思います。あれは正しいですか?

オーバーレイに ArrayList があります (BalloonItemizedOverlay を拡張します)。オーバーレイの createItem() メソッドは次のようになります。

@Override
protected OverlayItem createItem(final int index)
{
    final Person person = people.get(index);
    final GeoPoint gp = new GeoPoint(person.getLat(), person.getLng());

    final OverlayItem oi = new OverlayItem(gp, person.getName(), person.getName());
    oi.setMarker(new PersonDrawable(defaultMarker, person));

    return oi;
}

次にPersonDrawable、背景画像として 9 パッチを持ち、その上にテキストを描画するドローアブルがあります。

public PersonDrawable(final Drawable iBackground, final Person person)
{
    background = iBackground;
    text = person.getName();
    padding = new Rect();

    if (background instanceof NinePatchDrawable)
    {
        // This is getting hit, and just sets the value of the padding
        final NinePatchDrawable ninePatch = (NinePatchDrawable) background;
        ninePatch.getPadding(padding);
    }

    // set the bounds of the marker
    bounds = background.getBounds();

    paint = new Paint();
    paint.setColor(Color.rgb(255, 255, 255));
    paint.setFakeBoldText(true);
    paint.setTextSize(30);

    // find the bounds of the text
    final Rect textBounds = new Rect();
    paint.getTextBounds(text, 0, text.length(), textBounds);

    // set the left and right bounds to that of the text plus the padding (then center it)
    bounds.left = 0 - (textBounds.width() / 2) - padding.left;
    bounds.right = 0 + (textBounds.width() / 2) + padding.right;

    // set the bounds of the drawable
    setBounds(bounds);
}

@Override
public void draw(final Canvas canvas)
{
    // when it's time to draw, draw the background
    background.draw(canvas);
    // then draw the text within the padding
    canvas.drawText(text, bounds.left + padding.left, bounds.bottom - padding.bottom, paint);
}

各マーカーには別個の境界セットがあり、オーバーレイに描画された後でもその境界は異なります。(MapViewまたはOverlay) は からのオブジェクトを再利用していませんcreateItem()。ただし、Overlay常に 1 つのマーカーを選択し、それがすべてのマーカーのサイズであると想定しているようです。それはただの振る舞いですか?マーカーごとに異なる境界を尊重させるためにできることはありますか?

より大きなマーカーを選択することを決定したときの写真は次のとおりです。

ウルヴァリンの方が長いので大丈夫そうです

ただし、小さい方のマーカーをサイズとして使用することを選択した場合:

ビーストは少し短くてオーバーフロー

4

1 に答える 1

1

問題は、Drawableがリソースからロードされると、共有可能なリソースとして扱われることです。Drawableドキュメントから:

デフォルトでは、同じリソースからロードされたすべてのドローアブル インスタンスが共通の状態を共有します。1 つのインスタンスの状態を変更すると、他のすべてのインスタンスが同じ変更を受け取ります。

では、全体が同じサイズになることOverlayItemを前提としています。Drawable表示されている効果は、 への最後の変更がDrawable以前のすべての変更をオーバーライドしているため、 のすべての表示がDrawableまったく同じように表示されていることです。

解決策は、Drawableの変更を共有しないようにすることです。mutate()リソースからの Drawable の複数の読み込みと組み合わせてメソッドを使用すると、これを行うことができます。PersonDrawableこれは、上で概説したコンストラクターと組み合わせて行う必要があります。

于 2012-11-02T19:18:51.797 に答える