2011-05-30 2 views
2

ItemizedOverlayとOverlayItemを拡張する正しい方法についての長い情報を探してきましたが、私が得た結果はまだ私を満足させません。 いくつかの言葉で言えば、私は地図上にいくつかの場所に関連した異なる種類のマーカーを示す必要があります。表示されるべきマーカーのタイプは、場所自体の特定の特性によって決定される。私はまた、マーカーが選択されているときに特定のマーカーを表示する必要があり、マーカーが選択されていない、または焦点が合っていないときに別のマーカーを表示する必要があります。GoogleMap:カスタム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の移入さ: は、私が理解によると、これは私が書いたものです。 Now: 唯一のマーカーが正しく配置されているのはデフォルトのマーカーです。つまり、描画可能なものをMyItemizedOverlayのコンストラクタに渡し、boundCenterBottom(マップの指定されたポイントを指すように画像の中央の下点を設定する)で設定されます。 MyOverlayItemクラスのgetMarkerメソッドがnullを返さず、別のマーカーが使用されていると、画像が間違って表示されます(たとえば、影が画像の後ろにない場合など)。 getMarkerメソッドでは、drawable(drawable.setBoundsを使用)の境界ボックスを定義する必要があります。しかし、私はこのように、地図のポイントに置かなければならないポイントを何にするべきかを指定していないと考えています。

したがって、問題は、OverlayItemオブジェクトのgetMarkerメソッドから返されたマーカーdrawableに対して、ItemizedOverlayへの指定方法(MyItemizedOverlayのboundCenterBottomで行われているように、マップに配置する境界を指定すること)デフォルトのドロウアブルの場合)?それを行う最善の方法は何ですか? boundBottomCenterがでないようOverlayItemのgetMarker方法に置か

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

返さBERしている描画可能なため(仕事をしていません:テストを繰り返した後、と思われる)

答えて

12

[OK]を、;

ItemizedOverlay)。今はすべて正常に動作しており、デフォルト以外のマーカーでも正しく表示されます。

乾杯!

関連する問題