2013-07-15 2 views
9

In questo scenario, desidero disegnare una bitmap su Google Maps utilizzando gms v2 e ogni aggiornamento di posizione utente impone l'aggiornamento bitmap. Codice Attualmente io uso seguente frammento:Bitmap di ridisegno su Google Maps v2 per 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)); 
} 

Il metodo update() viene chiamato ogni secondo. Trovo questo approccio estremamente inefficiente e sto cercando una soluzione migliore (cioè che non richiede di aggiungere/rimuovere la sovrapposizione dopo ogni aggiornamento). Disegnare le primitive sulla mappa utilizzando addPolygon(...) e addPolyline(...) non è un'opzione in quanto richiede capacità di disegno non presenti in API standard.

risposta

6

Un'ottimizzazione potrebbe essere quella di verificare se la nuova posizione è uguale a quella precedente e non eseguire il ridisegno se questo è il caso. Inoltre, non penso che il descrittore debba essere creato ogni volta.

Un altro approccio per spostare i marcatori è descritto here. È quello del campione ufficiale.

4

Non sono sicuro se questo è ciò che desideri, ma è così che ho utilizzato bitmap personalizzate in Google Maps.

Il codice marcatore:

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

L'adattatore tooltip:

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