2010-05-08 8 views
18

Ich habe Overlay erweitert und draw() implementiert, um einige Sachen auf die Karte zu zeichnen. Wenn das Zoomen über mapController.zoomIn() ausgeführt wird (wird beim DoubleTapping der Map aufgerufen), wird das Overlay ordnungsgemäß auf die Karte gezeichnet.Weird Overlay zeichnen Verhalten beim Zoomen im MapView

Aber immer, wenn ich mit dem eingebauten Zoom-Controller heranzoome, wird das Overlay nicht richtig gezeichnet und das Verschieben der Karte wird benötigt, um das Overlay zu aktualisieren.

+0

Haben Sie (oder jemand anderes), um eine Lösung für dieses Problem finden? Es hat mich monatelang verrückt gemacht. –

+2

Die von mir gefundene Problemumgehung bestand darin, die Karte erst nach 500 ms zu aktualisieren, an der die Karte gezoomt wurde. Auf diese Weise wird die Überlagerung gezeichnet, nachdem die Karte bereits gezoomt wurde. Ich füge das Ereignis mit Handler.postDelayed() hinzu. Hoffe, das hilft – Itsik

+0

Ich habe MapView für ziemlich lange verwendet, dieses Problem nicht bemerkt. Wenn möglich, poste bitte deinen Code/Ablauf, um die Logik besser zu verstehen. – arcamax

Antwort

1
mapView.setBuiltInZoomControls(true); 
    mapView.getController().setZoom(15); 

    controller = mapView.getController(); 




    mapOverlays = mapView.getOverlays(); 

dies.

1

Ich habe Zoom-Controller ohne Probleme verwendet. selbst wenn Sie mehrere Ebenen auf der Karte gezeichnet haben und das Vergrößern/Verkleinern hat überhaupt keinen negativen Effekt.

Ich schlage vor, wie unten

mapController = mapView.getController(); 
mapController.zoomIn();// or .zoomOut() 

statt mit setZoom (XX) verwenden Sie bitte zoomIn()/zoomOut() zu verwenden, die glatten machen Zoomen, kann dies helfen, es besser funktionieren esp mit mehreren Overlays machen.

1

Ich habe in meiner Mapview App gefunden, dass ich meine eigene Position verfolgen möchte, also im Code habe ich ein Geopoint auf meine aktuelle GPS-Position gesetzt, dann benutze ich den folgenden Code, um die Kartenmitte auf diesen Punkt zu verschieben festgestellt, dass es wunderbar funktioniert:

Sie können eine Funktion erstellen, die auf den Überlagerungspunkt zoomt und animiert. Ich hoffe, das hilft.

1

Ich habe viele benutzerdefinierte Zeichen in meiner Kartenansicht erstellt. Leider wurden die Zeichnungsobjekte beim Herauszoomen vergrößert (wenn sie kleiner sein sollten). Um dies zu umgehen, überwachte ich den Benutzer beim Zoomen in einer ausführbaren Datei. Wenn sich der Zoom änderte, habe ich die Karte neu gezeichnet. Hier ist mein Code:

private Runnable zoomChecker = new Runnable() 
{ 
    public void run() 
    { 
     //check for updates 
     if((mLastUpdate>UPDATE_INTERVAL)&&(!DISPLAY_RED_CIRCLE)&&(!DISPLAY_ROUTE_LAYOUT)){ 
      updateRouteInformation(); 
      mLastUpdate = 0; 
     }else{ 
      mLastUpdate += 200; 
     } 
     //check for zoom level changes 
     int testZoomLevel = mMapView.getZoomLevel(); 
     if((testZoomLevel!=mZoomLevel)&&(DISPLAY_RED_CIRCLE)){ 
      //set that user is zooming 
      mStillZooming = true; 

      //remove overlays and clear map 
      removeOverlayItems();  
      mMapView.invalidate(); 

      //set zoom level as same 
      mZoomLevel = testZoomLevel; 
     } 
     if((testZoomLevel==mZoomLevel)&&(mStillZooming)){ 
      displayDriverBoundaries(MAP_DRIVER); 
     } 
     handler.removeCallbacks(zoomChecker); // remove the old callback 
     handler.postDelayed(zoomChecker, zoomCheckingDelay); // register a new one 
    } 
}; 
1
public class MyMap_MapControllerActivity extends MapActivity { 

    private MapView mapView; 
    //private MapController mapController; 
    MapView.LayoutParams lp; 
    int y = 10; 
     int x = 10; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mapView = (MapView)findViewById(R.id.map_view); 
     mapView.setSatellite(true); 
     mapView.setStreetView(true); 
     mapView.setTraffic(true); 



    GeoPoint center = mapView.getMapCenter(); 
    int latSpan = mapView.getLatitudeSpan(); 
    int longSpan = mapView.getLongitudeSpan(); 




    lp = new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT, 
    MapView.LayoutParams.WRAP_CONTENT, 
    x, y, 
    MapView.LayoutParams.TOP_LEFT); 
    View zoomControls = mapView.getZoomControls(); 
    mapView.addView(zoomControls, lp); 
    mapView.displayZoomControls(true); 
    } 



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