2

ItemizedOverlayとOverlayItemを拡張する正しい方法についての明確な情報を長い間探していましたが、得られた結果はまだ満足できません。一言で言えば、私は地図上にいくつかの場所に関連するさまざまな種類のマーカーを表示する必要があります。表示されるマーカーのタイプは、場所自体の特定のプロパティによって決まります。また、マーカーが選択されている場合は特定のマーカーを表示し、マーカーが選択されていないか焦点が合っていない場合は別のマーカーを表示する必要があります。私が理解していることによると、これは私が書いたものです:

public class MyItemizedOverlay extends ItemizedOverlay<MyOverlayItem> {

ArrayList<MyOverlayItem> items;
//...

public MyItemizedOverlay(Drawable drawable, /*...*/) {
    super(boundCenterBottom(drawable));
    //...
    populate();
}

public void addOverlay(MyOverlayItem overlay) {
    return this.items.add(overlay);
    populate();

@Override 
protected MyOverlayItem createItem(int index) {
    return this.items.get(index);
}

@Override
public int size() {
    return this.items.size();
}}

    public class MyOverlayItem extends OverlayItem {

//...

public Drawable getMarker(int stateBitset) {
    Drawable drawable;
    try {
        if (stateBitset == 0) {
            if (this.property.Equals("ON")) {
                drawable = this.context.getResources().getDrawable(R.drawable.on);
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                return drawable;
            } else if (this.property.Equals("OFF")) {
                drawable = this.context.getResources().getDrawable(R.drawable.off);
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                return drawable;
            } else {
                drawable = this.context.getResources().getDrawable(R.drawable.generic);
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                return drawable;
            }
        } else {
            //same thing as above, just with different drawables.
        }
    } catch (Exception e) {
        //...
    }

    return null;
}

MyItemizedOverlayが作成され、メインのMapActivityにMyOverlayItemが入力されます。現在:正しく配置されているマーカーはデフォルトのマーカーのみです。つまり、MyItemizedOverlayのコンストラクターに渡されたものを描画可能として持ち、boundCenterBottom(マップ内の指定されたポイントを指すように画像の中央下のポイントを設定する)で設定されたものです。MyOverlayItemクラスのgetMarkerメソッドがnullを返さず、別のマーカーが使用されている場合、画像は正しく表示されません(たとえば、影が画像に追従しません!)。getMarkerメソッドでは、ドローアブルのバウンディングボックスを定義する必要があります(drawable.setBoundsを使用)。ただし、このように、マップのポイントに配置する必要のあるポイントを指定する必要はないと思います。

したがって、問題は次のとおりです。OverlayItemオブジェクトのgetMarkerメソッドからItemizedOverlayに返されるマーカードローアブルに対して、マップに配置するために使用する境界を指定するにはどうすればよいですか(デフォルトのドローアブルのMyItemizedOverlayのboundCenterBottomで行うように) )?そして、それを行うための最良の方法は何ですか?

;)

4

1 に答える 1

12

さて、繰り返しテストした後、これは次のようです:

drawable.setBounds(-drawable.getIntrinsicWidth()/2, -drawable.getIntrinsicHeight(), drawable.getIntrinsicWidth() /2, 0);

OverlayItemのgetMarkerメソッドに配置され、返される必要のあるドローアブルがジョブを実行します(BoundBottomCenterがItemizedOverlayで実行するように)。これですべてが正常に機能し、デフォルト以外のマーカーも正しく表示されます。

乾杯!

于 2011-05-31T10:03:21.857 に答える