1

したがって、この投稿で説明したのとほぼ同じ問題がありますが、彼らが採用することを決定したソリューションのハックジョブは、私にはうまくいきません. 本当の解決策が必要なので、最適な解決策を見つけるために Android マップのソース コードをリバース エンジニアリングすることにしました。

私の現在の解決策は、OverlayItem を拡張するクラスの draw メソッドをオーバーライドすることですが、マップ上のオーバーレイ アイテムをタップしても機能しないという問題が発生します (タップは、実際のアイテムがある場所以外の場所に登録されます)。描かれた)。したがって、オーバーライドするメソッドの適切な組み合わせが見つかるまで、掘り下げ続けるつもりです。

4

1 に答える 1

1

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

次のように、OverlayItem のドローアブルに境界を設定するだけです。

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

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

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

@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 から始まることに注意してください。これは、実際には OverlayIcon の左上に変換されたキャンバスです。私の例では、幅を 50 に設定し、高さを 50 に設定すると、OverlayItem は定義された位置 (OverlayItem のコンストラクターで設定) を中心にマップ上に描画されます。Overlay のソースでこれが起こっているのを見ることができます:

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 呼び出しで発生します)

Overlayの完全なソースをここに示します。

(maps.jar をリバース エンジニアリングするのに多くの作業が必要だったので、自分の努力を最大限に活用したほうがよいでしょう)。

于 2012-04-04T01:47:10.390 に答える