2010-09-25 15 views
10

Sto lavorando a un'applicazione che visualizza la posizione degli elementi in movimento su un Google MapView. Ho bisogno di un modo per aggiornare la posizione delle icone che rappresentano gli elementi (così come modificare il quadrante delle icone ogni due secondi man mano che i dati aggiornati arrivano).Spostamento delle icone su un MapView Android

Attualmente ho un'attività nell'app che estende MapActivity. A questo punto ho sovrapposto un overlay statico che disegna alcune linee sulla mappa e un oggetto ItemOverlay che disegna un'icona statica.

C'è un metodo draw() che dice di essere usato da sovrapposizioni animate, ma sovrascriverlo per fare le mie animazioni non rende ancora nulla animato.

Devo dire all'app di rendere animato il mio overlay, o devo usare un diverso tipo di overlay?

risposta

4

Ci sono due cose che ho in mente riguardo al tuo problema.

In primo luogo, ha considerato l'utilizzo di invalidate() su MapView per imporre un nuovo aggiornamento? Quello è probabilmente non la soluzione più efficiente, ma dovrebbe almeno ottenere qualcosa da cui puoi lavorare.

In secondo luogo, è possibile aggiornare gli elementi sulla mappa richiamando di nuovo l'attività. Ecco uno example.

+0

Ho considerato l'opzione invalidata. Da quello che ho letto, può essere incerto sulle prestazioni, ma ci provo. Quello che mi chiedo è: come posso invalidare l'overlay ~ 20 volte al secondo per animare dolcemente le icone da un posto all'altro? – Hober

+1

forse dovresti prendere in considerazione l'utilizzo di un thread del timer, controlla questo http://www.anddev.org/viewtopic.php?t=126 –

+0

Ho finito per usare una vista regolare e postinvalidarlo da un TimerThread per darmi gli aggiornamenti. Come succede, non voglio che la mappa sia ridisegnata a ogni frame, solo gli oggetti in movimento su quest'altra vista, quindi sto cercando di usare la cache dei disegni per salvare MapView. Detto questo, la tua risposta sui thread del timer era praticamente giusta. Ti consente di pianificare l'aggiornamento per un numero fisso di volte al secondo in modo da poter garantire un buon framerate senza visualizzare tutti i fotogrammi possibili. – Hober

0

Sono ancora abbastanza nuovo per tutto questo Android Stuff, ma stavo leggendo Android Unleashed 2a ed (versione iniziale del programma di accesso anticipato) l'altro giorno, in cui copre le animazioni ... che suona proprio come la cosa.

Animation anim = new TranslateAnimation(startX, stopX, startY, stopY); 
anim.setDuration(2000 /* 2 seconds */); 
anim.init(overlayWid, overlayHei, parentWid, parentHei) 

myItemizedOverlay.startAnimation(anim); 

Nota che non ho effettivamente provato nulla del genere, ma questo è ciò che il libro/JavaDoc mi porta a credere funzionerà. Probabilmente dovrai chiamare prima di startAnimation(). Come ho detto ... difficilmente la mia area di competenza (ancora!).

Non credo che sarà necessario pasticciare invalido con questo approccio.

+0

Credo che non si possano usare le animazioni su ItemizedOverlays in questo modo. – Tom

1

L'utilizzo delle funzionalità integrate di MapView e Overlays per disegnare l'animazione probabilmente ucciderà la vostra perfromance. Il mio suggerimento è:

1) Combina MapView con un'altra vista. MapView ti fornirà le coordinate dello schermo necessarie e un'altra vista servirà da tela per l'animazione. Entrambe le viste dovrebbero occupare le stesse posizioni dello schermo (usa il layout della cornice);

2) Una volta ottenute le posizioni dell'indicatore della mappa che si desidera animare, rimuoverlo dalla mappa e iniziare a eseguire l'animazione dei movimenti dell'indicatore utilizzando la seconda vista. Qui è possibile sfruttare le classi di animazione Android specializzati (cioè Animazione, AnimationUtil, AnimationSet)

3) Una volta che hai fatto con l'animazione - aggiungere marker MapView sovrapposizione, ora nella sua nuova posizione e invalidare sovrapposizione

Forse c'è può essere un approccio più ottimale (ad esempio, utilizzare l'animazione direttamente su tela MapView), ma la linea di fondo - è necessario utilizzare un meccanismo di animazione specializzato per prevenire problemi di perfromance.

0

Come opzione per visualizzare l'animazione è possibile utilizzare il metodo addView della classe MapView. È semplice come:

  1. basta creare una vista (come ImageView o qualsiasi altra vista);
  2. inizializza il layout della vista, crea e passa MapView.LayoutParams per impostare il metodo LayoutParams;
  3. aggiungere la vista a MapView.

La vista si sposterà automaticamente quando si scorre la mappa.

public static void addAnimationToMap(MapView map, int animationResourceId, GeoPoint geoPoint) { 

    final ImageView view = new ImageView(map.getContext()); 
    view.setImageResource(animationResourceId); 

    //Post to start animation because it doesn't start if start() method is called in activity OnCreate method. 
    view.post(new Runnable() { 
     @Override 
     public void run() { 
      AnimationDrawable animationDrawable = (AnimationDrawable) view.getDrawable(); 
      animationDrawable.start(); 
     } 
    }); 

    map.addView(view); 

    MapView.LayoutParams layoutParams = new MapView.LayoutParams(
      MapView.LayoutParams.WRAP_CONTENT, 
      MapView.LayoutParams.WRAP_CONTENT, 
      geoPoint, 
      MapView.LayoutParams.BOTTOM_CENTER); 
    view.setLayoutParams(layoutParams); 
} 
Problemi correlati