2010-05-07 14 views
12

Sto provando a disegnare un percorso sul mio MapView. Ho esteso Overlay e implementato il metodo draw(). Il percorso è visualizzato correttamente, sebbene durante il debug, ho aggiunto un punto di interruzione su draw() e ho notato che viene chiamato costantemente.viene costantemente chiamato nella sovrapposizione della mia mappa Android

Voglio solo che venga ridisegnato se qualcuno sposta la mappa o esegue lo zoom (l'estrazione tiene conto di questi cambiamenti quando si disegna il percorso) Cosa può causare questo?

risposta

13

Esistono due metodi draw che possono essere sovrascritti.

void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) 

Desc: Disegna la sovrapposizione sulla mappa.

boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when)
Desc: richiama richiamo per sovrapposizioni animate.

Originariamente ho ignorato il secondo.
Dopo aver modificato il primo metodo, ha funzionato.

2

penso che il metodo di disegno sia chiamato ripetutamente perché lo sfondo viene ridisegnato costantemente. prova a impostare "MapView.ReticleDrawMode" su DRAW_RETICLE_UNDER. Questo in pratica dice a mapView di disegnare il reticolo sotto le sovrapposizioni. Quindi il metodo di disegno dell'overlay non verrà chiamato quando lo sfondo viene richiamato. questo ha risolto il problema per me.

per maggiori informazioni, guardate qui: MapView Api

2

Mi sono inciampato quando non mi sono reso conto che il metodo di sorteggio si chiama non solo tutti i segnalini che disegni, ma anche l'ombra di quei segnalini. Quindi, ad esempio, se hai due marcatori e le ombre sono impostate su true (che è l'impostazione predefinita), il metodo di disegno verrà chiamato 4 volte (una volta per ogni indicatore, una volta per ogni ombra dei marker)!

-1

Si può semplicemente aggiungere questo alla classe ItemizedOverlay:

@Override public void draw(Canvas c, MapView m, boolean shadow) { super.draw(c, m, false);} 

Questo eliminerà l'ombra dalla sovrapposizione mapview.

1

Per me sembra uno strano bug - a volte il metodo di disegno è chiamato continuamente, a volte no.

vedi here.

2

Dopo un'ulteriore revisione, l'Overlay draw() funziona effettivamente come descritto nella documentazione. Un pareggio per shadow = true e uno per shadow = false.

La cosa interessante è che il metodo specifico di sovrapposizione draw() risponde come pubblicizzato per ciascun elemento disegnato in MapView. Ad esempio, nel mio caso, sembra che risponda per ciascuna la mappa di google, il logo di Google disegnato sulla mappa e quindi la particolare sovrapposizione che ho disegnato io stesso. Ovviamente due volte per ogni (shadow true | false).

Questo è probabilmente il modo previsto per il rendering delle mappe. Non ho trovato o speso abbastanza tempo nella ricerca di queste informazioni.

Inoltre, nel mio caso, ho un pannello trasparente reso sulla mia mappa con i widget CheckBox (s) e TextView.TextView forza il metodo draw() per l'esecuzione non-stop poiché la vista testo è sempre in attesa di input e quindi innesca la ridisposizione dell'overlay.

1

Nella mia app, ho una barra di avanzamento indefinita (ad esempio, il cerchio che gira) mostra quando sto caricando i dati di rete per la mappa. Al termine del caricamento dei dati della rete, ho impostato la visibilità della barra di avanzamento su invisibile. Tuttavia, questo ha causato il ridisegno continuo della mappa in quanto sembra che qualsiasi animazione (immagino) che si svolge sulla mappa causerà il ridisegno della mappa stessa. La soluzione semplice a questo è di impostare invece la visibilità. Per esempio. cambiare questo:

ProgressBar loadingIcon = (ProgressBar) findViewById(R.id.loadingIcon); 
... 
//Network data now finished loading... 
loadingIcon.setVisibility(View.INVISIBLE); 

a questo:

loadingIcon.setVisibility(View.GONE); 

di rimozione del tutto dalla mappa, non è più anima la su di esso e quindi non causa draw() di essere chiamato un tempo indeterminato.

+0

Grazie mille per aver postato questo - hai appena risolto un problema che mi stava facendo impazzire. –

0

So che questo è un vecchio problema, ma l'ho appena incontrato. Questo è un post "per quello che vale".

Il ciclo di estrazione si è rivelato un errore di codifica da parte mia. Secondo il documento, se la routine di disegno restituisce true, si richiede un aggiornamento immediato. Se viene restituito falso, vengono effettuati solo due passaggi per ogni sovrapposizione; uno per ombra vero e uno per ombra falso. Stavo tornando vero e ho avuto un aggiornamento costante. Dopo che ho cambiato a restituire false, si sono verificati solo due passaggi per sovrapposizione. Nessun ciclo.

Problemi correlati