Drawing a line/path on Google Maps

后端 未结 13 844
执笔经年
执笔经年 2020-11-22 05:23

I\'ve been busy for a long time finding out how to draw a line between two (GPS) points on the map in HelloMapView but with no luck.

Could anyone please tell me how

13条回答
  •  攒了一身酷
    2020-11-22 05:33

    just i will find draw with some rectangle in mapview just we want change paint as we like

    EmptyOverlay.java

    public class EmptyOverlay extends Overlay {
    private float x1,y1;
    private MapExampleActivity mv = null;
    private Overlay overlay = null;
    
    public EmptyOverlay(MapExampleActivity mapV){
        mv = mapV;
    }
    
    @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 MapOverlay(mv, x1, y1);
                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;
    }
    }
    

    MapExampleActivity.java

     public class MapExampleActivity extends MapActivity {
    private MapView mapView;
    private boolean isEditMode = false;
    private Button toogle;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        toogle = (Button)findViewById(R.id.toogleMap);        
        toogle.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                toogleEditMode();
    
            }
        });
    
        mapView = (MapView)findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true); //display zoom controls
        //add one empty overlay acting as a overlay loader. This will catch press events and will add the actual overlays
        mapView.getOverlays().add(new EmptyOverlay(this));
        mapView.postInvalidate();
    }
    //toogle edit mode for drawing or navigating the map
    private void toogleEditMode(){
        isEditMode = !isEditMode;
    }
    
    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }
    @Override
    protected boolean isLocationDisplayed() {
        return false;
    }
    
    public boolean isEditMode(){
        return this.isEditMode;
    }
    
    public MapView getMapView(){
        return this.mapView;
    }
    }
    

    MapOverlay.java

     public class MapOverlay extends Overlay {
    
    private float x1,y1,x2,y2;
    private GeoPoint p1=null,p2=null;
    private MapExampleActivity mv = null;
    private Paint paint = new Paint();
    private boolean isUp = false;
    
    //constructor receiving the initial point
    public MapOverlay(MapExampleActivity mapV,float x,float y){
        paint.setStrokeWidth(2.0f);
        x1 = x;
        y1 = y;
        mv = mapV;
        p1 = mapV.getMapView().getProjection().fromPixels((int)x1,(int)y1);
    }
    //override draw method to add our custom drawings
    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
            long when) {
    
        if(p1 != null && p2 != 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(p1, screenPts1);
            Point screenPts2 = new Point();
            mapView.getProjection().toPixels(p2, 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;
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) {
        if(mv.isEditMode() && !isUp){
            if(e.getAction() == MotionEvent.ACTION_DOWN){
                x1 = y1 = 0;
                x1 = e.getX();
                y1 = e.getY();
                p1 = mapView.getProjection().fromPixels((int)x1,(int)y1);
    
            }
            //here we constantly change geopoint p2 as we move out finger
            if(e.getAction() == MotionEvent.ACTION_MOVE){
                x2 = e.getX();
                y2 = e.getY();
                p2 = mapView.getProjection().fromPixels((int)x2,(int)y2);
    
            }
            //---when user lifts his finger---
            if (e.getAction() == MotionEvent.ACTION_UP) {                
                isUp = true;
            }    
            return true;
        }
        return false;
    }
     }
    

    see this http://n3vrax.wordpress.com/2011/08/13/drawing-overlays-on-android-map-view/

提交回复
热议问题