Android Overlay为ontap方法设置Boundary?

时间:2012-07-25 16:12:47

标签: android android-mapview

最近,我通过创建一个覆盖类并使用路径绘制了一个自定义多边形。 我有一个地图的许多扇区,每个扇区被划分并用填充类填充颜色。但是当我使用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;
}
}

1 个答案:

答案 0 :(得分:2)

正在调用“最后一个”Overlay,因为它是最顶层的。 MapView0..end绘制叠加层,但是当有return true时一个事件,最后绘制的是最重要的,所以它首先获得事件,而Overlay.onTap 中的Overlay.onTouchEvent(同样适用于end..0,实际上很多Android事件)你说事件已被处理,因此它不会打扰调用覆盖层。因此事件处理程序以onTap顺序调用。

我没有使用ItemizedOverlay,但根据 CommonsWare Android - Map overlay onTouchEvent / onTap howto?,如果你使用onTap,那么你应该只为你的有限onTap /绘制区域。 屏幕上的任何触摸点都可以调用普通的onTouchEventsGeoPoint。在这种情况下,您可以找到getProjection MapView onTapLStart.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