2014-05-16 20 views
6

Sto simulando un'auto in movimento su un percorso preregistrato su Android Maps v2. Quando eseguo lo zoom sul tracciato a mano, funziona alla grande, ma quando sposto la telecamera sul percorso con mMap.animateCamera(), non carica l'area della mappa visibile, ottengo solo una mappa di bassa qualità molto pixelata. Se tocchi lo schermo e sposti un po 'la mappa o lo zoom, carica nuovamente questa parte.Le mappe Android v2 diventano di scarsa qualità quando l'area della mappa viene spostata automaticamente

Come posso ottenere che carichi sempre chiaramente la parte visibile?

MODIFICA: Ho aggiunto un'immagine di esempio: questo è ciò che vedo quando non tocco la mappa. Dopo averlo toccato, diventa chiaro (simile alla parte in basso a sinistra).

Example image

EDIT2: Ho un'idea, che questo è perché Google vuole di per evitare la mappa per essere memorizzate nella cache spostando rapidamente la fotocamera su una superficie. È possibile che questa sia la causa di questo problema? (La mappa mostra Budapest, in Ungheria, quale parte della mappa non è possibile scaricare per l'utilizzo offline ...) Ma qui voglio solo mostrare l'animazione e i marcatori di luogo, ho solo bisogno che l'area visibile sia memorizzata nella cache - ci sono un modo per aggirare questo comportamento?

Edit3: Il codice di animazione:

new Thread(new Runnable() { 

    @Override 
    public void run() { 
     // ... Calculating and sending new location, in an infinite loop with sleeps for timing 

     MainActivity.this.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       mMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude()))); 
      } 
     }); 
    } 
}).start(); 
+0

Si sta animando la fotocamera da un thread separato? Non potrei ricreare il tuo problema; la mappa si ri-focalizza dopo l'animazione quando provo. Puoi pubblicare il tuo codice di animazione della videocamera? – todd

+0

Sì, sto animando da un thread separato, usando runOnUiThread di activity. (Codice sorgente sopra) – hunyadym

risposta

2

finalmente trovato una soluzione. Sono stato in grado di ricreare il tuo problema usando il codice che hai fornito. Ho sostituito il tuo codice con il seguente e ha funzionato per me.

Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() { 

     @Override 
     public void run() { 
      // ... Calculating and sending new location, in an infinite loop with sleeps for timing 

      MainActivity.this.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        mMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude()))); 
       } 
      });   
     } 

    }, 0, 2000); 

è sufficiente rimuovere il codice per dormire e sostituire l'ultimo argomento in scheduleAtFixedRate (2000), con qualsiasi valore che si stava utilizzando per dormire.

+0

Grazie per la soluzione, ora è molto meglio con questo codice, ma a volte l'errore si verifica ancora. Hai idea del motivo per cui è importante se lo chiamo da un thread separato con sleeps o via Timer? – hunyadym

1

Ho avuto lo stesso problema. Dal momento che non è successo quando non è stata animata la telecamera, doveva essere qualcosa di simile.

Apperently la fotocamera deve essere in grado di finire il suo funzionamento, prima che aggiornerà i sfondo/strade ecc Dal momento che la mia app aggiorna la posizione di ogni secondo e la mappa ha bisogno di circa 2 secondi per completare io alla fine con strade pixelated e nessun ambiente.

La soluzione è quella di utilizzare uno dei sovraccarichi di animateCamera:

public final void animateCamera (CameraUpdate update, int durationMs, 
GoogleMap.CancelableCallback callback) 

sposta la mappa in base all'aggiornamento con un'animazione per una durata specificata e chiede un callback opzionale al termine. Vedi CameraUpdateFactory per una serie di aggiornamenti.

Ho usato per il mio caso una durata di 900 msec, quindi l'animazione viene eseguita prima che riceva una nuova posizione.

Per far funzionare il callback è necessario implementare GoogleMap.CancelableCallback nella classe.Ciò richiede di aggiungere due sostituzioni:

@Override 
public void onFinish() { 
} 

@Override 
public void onCancel() { 
} 

Essi non sono tenuti ad avere il problema risolto, benche siete liberi di aggiungere la logica più lì.

La chiamata di aggiornare la fotocamera può apparire così:

cameraPosition = new CameraPosition.Builder() 
        .target(current)    
        .zoom(zoomLevel)    
        .bearing(bearing) 
        .tilt(tilt)     
        .build();    

CameraUpdate update = CameraUpdateFactory.newCameraPosition(cameraPosition); 

map.animateCamera(update, 900, this);