在Google地图上绘制一个矩形

时间:2012-05-12 20:14:02

标签: android google-maps drawing overlay

我的计划是允许用户在地图上绘制一个矩形以标记某个区域,然后保存它。我找到了一种方法来做到这一点,但它没有做任何事情。这是代码到目前为止的样子。

public class Map extends MapActivity{

private MapView mvMap;
MapController kontrol;
float xs, ys, xe, ye;
GeoPoint start, end;
private Paint paint = new Paint();
private boolean up = false;

@Override
protected void onCreate(Bundle arg0) {
    // TODO Auto-generated method stub
    super.onCreate(arg0);
    setContentView(R.layout.map);
    mvMap = (MapView) findViewById(R.id.mvMap);
    mvMap.setBuiltInZoomControls(true);
    paint.setStrokeWidth(2.0f);
//  
//  DrawOverlay t = new DrawOverlay();
//  List<Overlay> olList = mvMap.getOverlays();
//  olList.add(t);
    mvMap.getOverlays().add(new EmptyOverlay());
    mvMap.postInvalidate();
    kontrol = mvMap.getController();
    GeoPoint ja = new GeoPoint(52172722, 21071987);
    kontrol.animateTo(ja);
    kontrol.setZoom(11);
}

@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}

class DrawOverlay extends Overlay{
    public boolean onTouchEvent(MotionEvent e, MapView m){
        if(up = false){
            if(e.getAction() == MotionEvent.ACTION_DOWN){
                xs = ys = 0;
                xs = e.getX();
                ys = e.getY();
                start = mvMap.getProjection().fromPixels((int)xs,(int)ys);
                //draw(null, m, up);
            }
            if(e.getAction() == MotionEvent.ACTION_MOVE){
                xe = e.getX();
                ye = e.getY();
                end = mvMap.getProjection().fromPixels((int)xe,(int)ye);

            }
            if(e.getAction() == MotionEvent.ACTION_UP){
                up = true;
            }
        }
        return true;
    }

    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
            long when) {

        if(start != null && end != null){
            //get the 2 geopoints defining the area and transform them to pixels
            //this way if we move or zoom the map rectangle will follow accordingly
            Point screenPts1 = new Point();
            mapView.getProjection().toPixels(start, screenPts1);
            Point screenPts2 = new Point();
            mapView.getProjection().toPixels(end, screenPts2);

            //draw inner rectangle
            paint.setColor(0x4435EF56);
            paint.setStyle(Style.FILL);
            canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint);
            //draw outline rectangle
            paint.setColor(0x88158923);
            paint.setStyle(Style.STROKE);
            canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint);
        }
        return true;
    }

}

public class EmptyOverlay extends Overlay {
    private float x1,y1;
    private Overlay overlay = null;

    public EmptyOverlay(){

    }

    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
            long when) {
        // TODO Auto-generated method stub
        return super.draw(canvas, mapView, shadow, when);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) {
    //  if(mv.isEditMode()){
            if(e.getAction() == MotionEvent.ACTION_DOWN){
                //when user presses the map add a new overlay to the map
                //move events will be catched by newly created overlay
                x1 = y1 = 0;
                x1 = e.getX();
                y1 = e.getY();

                overlay = new DrawOverlay();
                mapView.getOverlays().add(overlay);

            }
            if(e.getAction() == MotionEvent.ACTION_MOVE){
            }
            //---when user lifts his finger---
            if (e.getAction() == MotionEvent.ACTION_UP) {                

            }    
           // return true;
//      }
        return false;
    }
}

我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:3)

使用此代码,它将适用于您在任何标记位置上绘制带有内部文本的rectangel。此代码将为许多朋友绘制许多矩形,我们已通过覆盖项目

      public void draw(android.graphics.Canvas canvas, MapView mapView,
                  boolean shadow)
{
    super.draw(canvas, mapView, shadow);

    // go through all OverlayItems and draw title for each of them
    for (OverlayItem item:mOverlays)
    {

        GeoPoint point = item.getPoint();
        Point markerBottomCenterCoords = new Point();
        mapView.getProjection().toPixels(point, markerBottomCenterCoords);

        /* Find the width and height of the title*/
        TextPaint paintText = new TextPaint();
        Paint paintRect = new Paint();

        Rect rect = new Rect(markerBottomCenterCoords.x,markerBottomCenterCoords.y,33,44);
        paintText.setTextSize(FONT_SIZE);
        paintText.getTextBounds(item.getTitle(), 0, item.getTitle().length(), rect);
       // rect.height()=34;
        rect.inset(-TITLE_MARGIN, -TITLE_MARGIN);
        int markerHeight=34;// this will place to a height of 34 athe top of the mark location
        rect.offsetTo(markerBottomCenterCoords.x - rect.width()/2, markerBottomCenterCoords.y - markerHeight - rect.height());

        paintText.setTextAlign(Paint.Align.CENTER);
        paintText.setTextSize(FONT_SIZE);
        paintText.setARGB(255, 255, 255, 255);
        paintRect.setARGB(255,148,0,211);//s(255, 178, 34, 34);
        paintRect.setTextAlign(Align.CENTER);
        canvas.drawRoundRect( new RectF(rect), 0, 29, paintRect);
       canvas.drawText(item.getTitle(), rect.left + rect.width() / 2,
                rect.bottom - TITLE_MARGIN, paintText);

    }
}
相关问题