2012-04-03 10 views
1

私はほぼ同じproblem discussed in this postを持っていますが、単に彼らと一緒に行くと決めた解決策のハック・ジョブは、私のために働くつもりはありません。本当のソリューションが必要なので、私はアンドロイドマップのソースコードをリバースエンジニアリングして最適なソリューションを見つけることにしました。Google Androidマップでオーバーレイアイテムのサイズをどのように制御しますか?

私の現在の解決策は、オーバーレイアイテムを拡張するクラスの描画メソッドをオーバーライドすることですが、マップ上のオーバーレイアイテムのタップが機能しないという問題に遭遇します(タップは、実際のアイテムが描画されます)。だから、私は、オーバーライドするメソッドの適切な組み合わせが見つかるまで、掘り続けるつもりです。

答えて

1

私の場合と同じ問題を抱えている人にとっては、解決策は実際には非常に簡単です。

あなたがしなければならないのは、このように、OverlayItemの描画可能に境界を設定されている:

Drawable d = myOverlayItem.getMarker(0); 
d.setBounds(-xWidth/2, -yWidth/2, xWidth, yWidth); 

getMarkerためのパラメータは、実際にoverlayItemの状態に依存しますが、個人的に私のためにすべてのための同じ私の状態は気にしなかったので、0を使用しました。

実際に境界を設定する場所によってソリューションがどのように異なるかはわかりませんが、私はItemizedOverlayサブクラスの描画メソッド内で行いました:

@Override 
public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) { 
    if (!shadow) { 
     // Do your projection calculations here, if necessary 

     for (int i = 0; i < mOverlays.size(); i++) { 
      Drawable d = mOverlays.get(i).getMarker(0); 
      d.setBounds(-width/2, -height/2, width/2, height/2); 
     } 
    } 

    super.draw(canvas, mapView, shadow); 
} 

オーバーレイアイテムの境界は0,0から始まり、実際にはオーバーレイアイコンの左上にキャンバスが移動することに注意してください。私の例では、幅を50に設定し、高さを50に設定すると、オーバーレイアイテムは、オーバーレイアイテムのコンストラクタで設定された定義位置を中心としたマップに描画されます。あなたは、オーバーレイのソースにこの出来事を見ることができます:

protected static void drawAt(Canvas canvas, Drawable drawable, int x, int y, boolean shadow) 
    { 
     // .... Do Stuff .... 

     canvas.save(); 
     canvas.translate(x, y); 

     // .... Do Stuff .... 

     drawable.draw(canvas); 

     // .... Do Stuff .... 

     canvas.restore(); 
    } 

(それはcanvas.translate呼び出しで起こる)

誰かがhere's the full source for Overlayを気にすることをオフのチャンスに。

(マップエンジニアのリバースエンジニアリングには多くの労力がかかりましたので、私の努力を最大限に引き出すことができます)

関連する問題