Sto lavorando a un'app Android già esistente su iPhone.Problema con un numero elevato di indicatori sulla mappa
Nell'app, c'è un'attività mappa che ha (ho contato) circa 800 marker in quattro gruppi contrassegnati da drawable in quattro colori diversi. Ogni gruppo può essere attivato o disattivato. Informazioni sui marker che ho all'interno di List. Creo una mappaOverlay per ogni gruppo, quindi allego questa sovrapposizione alla mappa. Credo fermamente che la parte di codice che ho fatto correttamente. Ma aggiungerò comunque il mio codice ...
Il fatto è che il mio Nexus One non può gestire la mappa con tutti quei marker. Ci vogliono circa 15 secondi per disegnare 500 segnalini. Poi quando tutto è disegnato, la mappa non è abbastanza liscia. È un po 'difficile da ingrandire e navigare. Può essere fatto, ma l'esperienza è negativa e vorrei vedere se qualcosa può essere fatto lì. So che se evito String> Conversione doppia, potrei risparmiare un po 'di tempo, ma dubito che sarebbe significativo.
iPhone sembra non abbia problemi a mostrare tutti questi indicatori. Ci vogliono circa 1-2 secondi per mostrarli tutti e lo zoom e il panning non sono poi così male. Il rallentamento è evidente ma comunque accettabile. Personalmente ritengo che non valga la pena di disegnare tutti quei marker, ma l'app è progettata da qualcun altro e non dovrei apportare cambiamenti drastici.
Non sono sicuro di cosa fare qui. Sembra che dovrò trovare diverse funzionalità, magari usare la posizione GPS, se noto, e disegnare solo marcatori entro un raggio, o, se la posizione non è nota, usare il centro dello schermo (mappa) e disegnare i marker attorno a questo. Dovrò avere una spiegazione ragionevole per i miei capi nel caso io faccia questi cambiamenti.
Apprezzo se qualcuno ha qualche ida.
E il codice:
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.pin_blue);
drawable = this.getResources().getDrawable(R.drawable.pin_blue);
ArrList = appState.GetSleepArrList();
ItemizedOverlay itemizedoverlay = new ItemizedOverlay(drawable, this);
...
...
for (int m = 0; m < ArrList.size(); m++) {
tName = ArrList.get(m).get("name").toString();
tId = ArrList.get(m).get("id").toString();
tLat = ArrList.get(m).get("lat").toString();;
tLng = ArrList.get(m).get("lng").toString();;
try {
lat = Double.parseDouble(tLat);
lng = Double.parseDouble(tLng);
p1 = new GeoPoint(
(int) (lat * 1E6),
(int) (lng * 1E6));
OverlayItem overlayitem = new OverlayItem(p1, tName, tId);
itemizedoverlay.addOverlay(overlayitem);
} catch (NumberFormatException e) {
Log.d(TAG, "NumberFormatException" + e);
}
}
mapOverlays.add(itemizedoverlay);
mapView.postInvalidate();
................................
public class ItemizedOverlay extends ItemizedOverlay<OverlayItem>
{
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
private Context mContext;
public HelloItemizedOverlay(Drawable defaultMarker, Context context)
{
super(boundCenterBottom(defaultMarker));
mContext = context;
}
public void addOverlay(OverlayItem overlay)
{
mOverlays.add(overlay);
populate();
}
@Override
protected OverlayItem createItem(int i)
{
return mOverlays.get(i);
}
@Override
public int size()
{
return mOverlays.size();
}
@Override
protected boolean onTap(int index)
{
final OverlayItem item = mOverlays.get(index);
... EACH MARKER WILL HAVE ONCLICK EVENT THAT WILL PRODUCE CLICABLE
... BALOON WITH MARKER'S NAME.
return true;
}
}
Io ho mai letto il codice per essere equi, ma sì, ho usato il mio algoritmo percorso di semplificazione. Ho dovuto tracciare circa 1379 segnaposto e l'ho ridotto a 65. Se sei interessato sarò felice di spiegare l'algo ma dato che non facciamo i compiti su questo sito non posso darti "teh-codez" :) – Reno
Da qualche parte in questo forum ho letto che ItemizedOverlay è progettato per decine di elementi. Se ci sono più possibilità di passare a Sovrapposizione, potrebbe essere necessario. Posso confermarlo. Due app con oltre 1000 ItemizedOverlays avevano bisogno di un minuto circa per disegnare. Dopo il passaggio a Sovrapposizione è sempre entro 2-4 secondi. –
Reno, puoi spiegare il tuo algoritmo di ottimizzazione? Non c'è proprio nessun uso della mappa con tutti quei segnalini. È troppo lento e troppo ingombrante. – bobetko