1

私は現在、Androidマップベースのアプリを作成しています。このアプリの目的は、マップビューに複雑なオーバーレイを表示することです。これを行うために、カスタムオーバーレイとオーバーライドdraw()関数を使用しています。

その部分は完全に機能しているので、各オーバーレイのonTapイベントを処理したいと思います。私が現在していること:

public class MapOverlay extends Overlay {


    public MapOverlay(Kml kml,String color,Projection projection){
    }   

    public void draw(Canvas canvas, MapView mapv, boolean shadow){
        super.draw(canvas, mapv, shadow);

        // draw path...
    }

    @Override
    public boolean onTap(GeoPoint gp, MapView mapView) {
        Log.i("Overlay","Say whaaaat!");
        return super.onTap(gp, mapView);
    }
}

予想どおり、各オーバーレイはマップビュー全体をカバーしているため、オーバーレイをタップすると、すべてのオーバーレイでonTapイベントが発生します。6つのオーバーレイがあるとすると、どのパスがタップされたかわかりません。

それを行うための解決策はありますか?

アップデート:

これで、ItemizedOverlay(ItemizedBaloonOverlayも関連付けられています)を使用してマップにマーカーを表示することに成功しましたが、それは私が望んでいるものではありません。

ポリゴン内でタップが行われたかどうかを検出し、その場合にのみタップイベントを発生させるPolygonOverlayのようなものが欲しいです。

ありがとう

4

2 に答える 2

0

別の投稿からのこの回答に基づいて、カスタムオーバーレイを作成しましたが、機能します。したがって、基本的に、ItemizedOverlayのものは必要ありません(overlayitemを表示する場合を除く)。

以前のMapOverlayクラスを使用して、基本的なonTap()関数を追加するだけです。

public class MapOverlay extends Overlay {

    private Path path;

    public MapOverlay(){
        super();
    }

    @Override
    public void draw(Canvas canvas, MapView mapv, boolean shadow) {
        super.draw(canvas, mapv, shadow);

            // draw your path and store it in variable path
    }

    @Override
    public boolean onTap(GeoPoint geoPoint, MapView mapView) {

        RectF rectF = new RectF();
        path.computeBounds(rectF, true);
        Region region = new Region();
        region.setPath(path, new Region((int) rectF.left, (int) rectF.top, (int) rectF.right, (int) rectF.bottom));

        Point point = new Point();
        mapView.getProjection().toPixels(geoPoint, point);

        if (region.contains(point.x, point.y)) {
            Log.d("onTap", point.x+" "+point.y);
        }

        return super.onTap(geoPoint, mapView);
    }

}

以上です!残っているのは、1つだけを逆さまに発射したい場合は、zオーダーを確認することだけです。MapOverlayクラスで追跡していれば、大したことではないはずです。

于 2012-04-06T12:52:33.047 に答える
0

onTap(GeoPoint gp、MapView map)の代わりに次のメソッドを使用します

@Override
protected boolean onTap(int index) {
final OverlayItem item = mOverlays.get(index);        
//your code for your requirement
return true;
}
于 2012-04-06T09:55:31.733 に答える