我目前正在制作基于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这样的东西,它会检测水龙头是否在多边形内完成,并且在这种情况下只会触发一个水龙头事件。
由于
答案 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类中跟踪它,那应该不是什么大不了的事。