2013-07-15 11 views
9

In diesem Szenario möchte ich ein Bitmap in Google Maps mit gms v2 zeichnen und jedes Benutzerpositionsupdate erzwingt Bitmap-Update. Derzeit verwende ich folgenden Code-Schnipsel:Bitmap neu zeichnen in Google Maps v2 für Android

public void init(){ 
    result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    canvas = new Canvas(result); 
} 

public void update(){ 
    // draw on canvas ... 
    draw(result); 
} 

public void draw(Bitmap modifiedBmp) { 
    if (overlay != null) { 
     overlay.remove(); 
    } 

    BitmapDescriptor descriptor = BitmapDescriptorFactory.fromBitmap(modifiedBmp); 
    overlay = map.addGroundOverlay(new GroundOverlayOptions().image(descriptor).positionFromBounds(bounds).zIndex(100)); 
} 

Die update() Methode wird jede Sekunde aufgerufen. Ich finde diesen Ansatz äußerst ineffizient und suche nach einer besseren Lösung (d. H., Dass nach jedem Update kein Overlay hinzugefügt/entfernt werden muss). Das Zeichnen von Primitiven auf Karten mit addPolygon(...) und addPolyline(...) ist keine Option, da ich Zeichenfunktionen benötige, die in der Standard-API nicht vorhanden sind.

Antwort

6

Eine Optimierung könnte sein, zu überprüfen, ob die neue Position die gleiche wie die alte ist, und nicht neu zeichnen, wenn dies der Fall ist. Ich denke auch nicht, dass der Deskriptor jedes Mal erstellt werden muss.

Ein anderer Ansatz zum Bewegen von Markern ist beschrieben here. Es ist der aus der offiziellen Probe.

4

Ich bin mir nicht sicher, ob dies das ist, was Sie wollen, aber so habe ich benutzerdefinierte Bitmaps in Google Maps verwendet.

Der Marker Code:

BitmapDescriptor iconBitmap = BitmapDescriptorFactory 
        .fromResource(R.drawable.item_map_marker); 

MarkerOptions options = new MarkerOptions(); 
options.position(new LatLng(hs.lat, hs.lng)); 
options.title(hs.sitename); 
options.snippet(hs.street + ", " + hs.suburb); 
options.icon(iconBitmap); 

mMap.addMarker(options); 

Der Tooltip-Adapter:

public class MyInfoWindowAdapter implements InfoWindowAdapter { 

    public interface OnRenderCustomInfoWindow { 

     public void onRender(Marker marker, View mWindow); 
    } 

    private View      mWindow; 

    private OnRenderCustomInfoWindow mRenderer; 

    public MyInfoWindowAdapter(Context context, 
      OnRenderCustomInfoWindow onRender) { 
     mRenderer = onRender; 
     mWindow = LayoutInflater.from(context).inflate(
      R.layout.view_services_map_infowindow, null); 
    } 

    @Override 
    public View getInfoWindow(Marker marker) { 
     mRenderer.onRender(marker, mWindow); 
     return mWindow; 
    } 

    @Override 
    public View getInfoContents(Marker marker) { 
     return null; 
    } 
} 
Verwandte Themen