绘制一个矩形到谷歌地图 [英] Drawing a rectangle onto a Google Map

查看:165
本文介绍了绘制一个矩形到谷歌地图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的计划是允许用户以纪念一个区域并稍后保存绘制一个矩形到地图。我发现这样做的方法,但不起任何作用。这里是code怎么看起来那么远。

My plan is to allow user to draw a rectangle onto a map in order to mark an area and later save it. I found a method to do it, but it does nothing. Here is how the code looks so far.

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;
    }
}

我将感谢任何帮助。

I will be grateful for any help.

推荐答案

使用此code它会为你的工作超过任何标记的位置绘制里面文字rectangel,这code会许多绘制矩形为此我们通过覆盖项目通过了很多朋友,

      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);

    }
}

这篇关于绘制一个矩形到谷歌地图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆