2012-10-19 7 views
5

W mojej aplikacji Narysuj farbę w wolnej ręce w widoku mapy, ale wyszukiwanie wielu informacji w końcu otrzymałem z prostokąta w kształcie narysuj na widok mapy, ale chcę zamiast prostokąta narysować wolną rękę, jak zygzak, jak zmienić kod Każda pomoc proszę ..Android, jak narysować farbę w wolnej ręce w MapView za pomocą nakładki?

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 Path path = new Path(); 
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(Color.BLUE); 
    // paint.setStyle(Style.FILL); 
     canvas.drawPath(path, paint);  
     canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint); 
     //draw outline rectangle 

    // paint.setColor(Color.YELLOW); 
     paint.setStyle(Style.STROKE); 
    // canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint); 
     canvas.drawPath(path, 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; 
} 

}

użyciu tego i stanie wyciągnąć jak tego prostokąta kształtach i sporządzić ponownie kliknąć przycisk przełączania (można wyciągnąć kilka razy)

Rectangle shape

Chcę rysować linie zamiast prostokąta, jak na poniższym obrazku (rysuj wiele razy).

enter image description here

wreszcie znalazłem ten link ten link zapewnić kształt prostokąta wyciągnąć http://n3vrax.wordpress.com/2011/08/13/drawing-overlays-on-android-map-view/

wystarczy zmienić prostokąt uwolnić narysować jakiś pomysł, proszę ....

Odpowiedz

5

Można wolna ręka narysować linię za pomocą mieszek Kod:

Kod

public class HandDrawOverlay extends Overlay { 

private boolean editMode = false; 
private boolean isTouched = false; 
private Paint paint = new Paint(); 
private Point screenPt1 = new Point(); 
private Point screenPt2 = new Point(); 
private ArrayList<GeoPoint> points = null; 

public HandDrawOverlay(){ 
    paint.setStrokeWidth(2.0f); 
    paint.setStyle(Style.STROKE); 
    paint.setColor(Color.BLUE); 
} 

@Override 
public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
    if(points != null && points.size() > 1){ 
     mapView.getProjection().toPixels(points.get(0), screenPt1); 
     for(int i=1; i<points.size();i++){ 
      mapView.getProjection().toPixels(points.get(i), screenPt2); 
      canvas.drawLine(screenPt1.x, screenPt1.y, screenPt2.x, screenPt2.y, paint); 
      screenPt1.set(screenPt2.x, screenPt2.y); 
     } 
    } 
}  

@Override 
public boolean onTouchEvent(MotionEvent e, MapView mapView) { 
    if(editMode){ 
     int x = (int)e.getX(); 
     int y = (int)e.getY(); 
     GeoPoint geoP = mapView.getProjection().fromPixels(x,y); 

     switch (e.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      isTouched = true; 
      points = new ArrayList<GeoPoint>(); 
      points.add(geoP); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if(isTouched) 
       points.add(geoP); 
      break; 
     case MotionEvent.ACTION_UP: 
      if(isTouched) 
       points.add(geoP); 
      isTouched = false; 
      break; 
     } 
     mapView.invalidate(); 
     return true; 
    } 
    return false; 
} 

/** 
* @return the editMode 
*/ 
public boolean isEditMode() { 
    return editMode; 
} 

/** 
* @param editMode the editMode to set 
*/ 
public void setEditMode(boolean editMode) { 
    this.editMode = editMode; 
} 
} 

używać

HandDrawOverlay handDrawOverlay; 
handDrawOverlay = new HandDrawOverlay(); 
mapView.getOverlays().add(handDrawOverlay); 

//Set edit mode to true to start drwaing 
handDrawOverlay.setEditMode(true); 

//Set edit mode to true to stop drwaing 
handDrawOverlay.setEditMode(false); 

Uwaga

Jest to pełne funkcjonowanie przykład pomóc wyjściowy. Należy jednak zoptymalizować kod, aby był bardziej wydajny (np. Za pomocą Path, aby zapisać ścieżkę rysowania w onDraw(), zmniejszając liczbę punktów zapisanych w onTouch() itp.).

Ciesz się tym.

+0

używamy przycisku narysowania dla rysownika na mapie obok, gdy przycisk losowania połączenia wyświetli widok mapy za pomocą farby ... wtedy będziemy powiększać i przesuwać ... ale od tego, gdy przycisk losowania połączenia po raz drugi również narysujemy obraz .. –

+0

@Luic Draw za drugim razem rysowanie farby nie jest pokazane i kiedy klikam przycisk nie mogę powiększyć widoku mapy ..... Po prostu spójrz na przykładowy link, mamy jasny pomysł ... – NagarjunaReddy

+0

Nie mogę zrozumieć twojego komentarza, potrzebujesz w celu przeformułowania go. Zapewniam, że powyższy kod działa idealnie, ponieważ przetestowałem go przed pocztą. Jeśli chodzi o zoom, to nie możesz powiększyć, gdy rysujesz alover na mapie. Jeśli chcesz, aby zoom działał, musisz ustawić 'editMode()' na false lub musisz wykluczyć obszar przycisków powiększania z obszaru rysowania. – Luis

Powiązane problemy