如何在基于路径的地图叠加层上处理onTap事件?

时间:2012-04-06 09:39:31

标签: android path overlay android-mapview

我目前正在制作基于Android地图的应用。此应用程序的目的是在mapview上显示复杂的叠加层。为此,我使用自定义叠加层并覆盖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这样的东西,它会检测水龙头是否在多边形内完成,并且在这种情况下只会触发一个水龙头事件。

由于

2 个答案:

答案 0 :(得分:0)

使用以下方法代替onTap(GeoPoint gp,MapView地图)

@Override
protected boolean onTap(int index) {
final OverlayItem item = mOverlays.get(index);        
//your code for your requirement
return true;
}

答案 1 :(得分:0)

基于另一篇文章中的this answer,我构建了自定义叠加层,它可以正常工作!所以基本上,不需要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);
    }

}

就是这样! 剩下的唯一事情就是检查z顺序,如果你只想解开一个上部。如果我在MapOverlay类中跟踪它,那应该不是什么大不了的事。