最近,我通过创建一个覆盖类并使用路径绘制了一个自定义多边形。 我有一个地图的许多扇区,每个扇区被划分并用填充类填充颜色。但是当我使用ontap函数时,只调用最后一个覆盖项ontap函数。
我相信是因为我没有为叠加层设置边界?以下是我的重叠代码
public class SectorOverlay extends Overlay{
CustomPolygon customPolygon =null;
Context context;
public SectorOverlay(Context context, CustomPolygon customPolygon) {
this.context=context;
this.customPolygon =customPolygon;
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow)
{
shadow=false;
Paint paint = new Paint();
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStrokeWidth(2);
paint.setColor(0x10000000);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setAntiAlias(true);
Point point1_draw = new Point();
if(customPolygon!=null)
{
Path path = new Path();
path.setFillType(Path.FillType.EVEN_ODD);
for(int n=0;n<customPolygon.getCorrdinateList().size();n++)
{
GeoPoint sector1 = new GeoPoint((int)(customPolygon.getCorrdinateList().get(n).getLatitude()*1e6), (int)((customPolygon.getCorrdinateList().get(n).getLongitude())*1e6));
if(n==0){
mapView.getProjection().toPixels(sector1, point1_draw);
path.moveTo(point1_draw.x,point1_draw.y);
}else
{
mapView.getProjection().toPixels(sector1, point1_draw);
path.lineTo(point1_draw.x,point1_draw.y);
}
}
path.close();
canvas.drawPath(path, paint);
}
}
@Override
public boolean onTap(GeoPoint p, MapView mapView) {
new CommonOpearation().showToast(context, customPolygon.getName());
return true;
}
}
答案 0 :(得分:2)
正在调用“最后一个”Overlay
,因为它是最顶层的。 MapView
从0..end
绘制叠加层,但是当有return true
时一个事件,最后绘制的是最重要的,所以它首先获得事件,而是Overlay.onTap
中的Overlay.onTouchEvent
(同样适用于end..0
,实际上很多Android事件)你说事件已被处理,因此它不会打扰调用覆盖层。因此事件处理程序以onTap
顺序调用。
我没有使用ItemizedOverlay
,但根据 CommonsWare Android - Map overlay onTouchEvent / onTap howto?,如果你使用onTap
,那么你应该只为你的有限onTap
/绘制区域。
屏幕上的任何触摸点都可以调用普通的onTouchEvents
和GeoPoint
。在这种情况下,您可以找到getProjection
MapView
onTap
从LStart.x = minXOfPolygon, LEnd.x = maxXOfPolygon, LStart.y = LEnd.y = 0
反向应用(x,y)获取(lon,lat)。或者使用LStart.x
(再次,我之前没有听说过)。
如果你需要使用绘制的叠加多边形进行命中测试,这里有一个可以帮助你确定该点是否在(不一定是凸面)多边形中: http://verkkoopetus.cs.utu.fi/vhanke/trakla/PointInPolygon.html
LEnd.x
(为了安全起见,您可能需要在findIntersection
和{{1}}将该行延长1个单位。)