Domanda

Io voglio fare il seguente e sono di tipo bloccato su questi per un paio di giorni:

  1. I stava cercando di disegnare polilinee (ho codificato polilinee, ma sono riuscito a decodificare quelli) che si muovono quando sposto la mappa .
    L'unica soluzione che ho trovato è stato per Geopoints da trasformare in coordinate dello schermo ... che non si muoverà se sposto la mappa.

  2. ho usato HelloItemizedOverlay per aggiungere circa 150 marcatori e diventa molto molto lento .
    Qualsiasi idea di cosa fare? Stavo pensando di discussioni (handler).

  3. Ero alla ricerca di una sorta di funzione timer che esegue una data funzione periodicamente , per esempio, ogni 1 minuto o giù di lì.

  4. Sono stato anche alla ricerca di modi per cancellare la mappa di Google da tutti i marcatori / linee , ecc.

È stato utile?

Soluzione

risposte date qui di seguito:

1) Ecco una soluzione che ho usato:

/** Called when the activity is first created. */
private List<Overlay> mapOverlays;

private Projection projection;  

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    linearLayout = (LinearLayout) findViewById(R.id.zoomview);
    mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);

    mapOverlays = mapView.getOverlays();        
    projection = mapView.getProjection();
    mapOverlays.add(new MyOverlay());        

}

@Override
protected boolean isRouteDisplayed() {
    return false;
}

class MyOverlay extends Overlay{

    public MyOverlay(){

    }   

    public void draw(Canvas canvas, MapView mapv, boolean shadow){
        super.draw(canvas, mapv, shadow);

    Paint   mPaint = new Paint();
        mPaint.setDither(true);
        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(2);

        GeoPoint gP1 = new GeoPoint(19240000,-99120000);
        GeoPoint gP2 = new GeoPoint(37423157, -122085008);

        Point p1 = new Point();
        Point p2 = new Point();

    Path    path = new Path();

    Projection  projection.toPixels(gP1, p1);
        projection.toPixels(gP2, p2);

        path.moveTo(p2.x, p2.y);
        path.lineTo(p1.x,p1.y);

        canvas.drawPath(path, mPaint);
    }

courtesy: Disegnare una linea / percorso su Google Maps

2) Ecco cosa ha funzionato per me:

createMarkers()
{ 
    for(elem:bigList)
    { 
        GeoPoint geoPoint = new GeoPoint((int)(elem.getLat()*1000000), (int) (elem.getLon()*1000000)); 
        OverlayItem overlayItem = new OverlayItem(geoPoint, elem.getName(), elem.getData()); 
        itemizedOverlay.addOverlay(overlayItem); 
    } 

    itemizedOverlay.populateNow(); 
    mapOverlays.add(itemizedOverlay); //outside of for loop 
} 

e in myoverlay:

public void addOverlay(OverlayItem overlay) 
{ 
    m_overlays.add(overlay); 
} 

public void populateNow()
{
    populate(); 
}

courtesy: stackoverflow.com collegamento sconosciuto

3) Il modo migliore è quello di utilizzare una classe timer. Una descrizione molto dettagliata della classe timer e come usarlo è dato a questo link:

http://life.csu.edu.au /java-tut/essential/threads/timer.html

4) Ho usato questo codice:

if(!mapOverlays.isEmpty()) 
{ 
    mapOverlays.clear(); 
    mapView.invalidate(); 
} 

Spero che queste risposte aiuto atleast un'altra persona. Grazie.

Altri suggerimenti

Ho lo stesso problema. Stiamo sviluppando un'applicazione per iPhone e un'applicazione Android allo stesso tempo. Ho 2500 + mappa sovrapposizioni. Nessun problema su iPhone; un enorme prestazioni colpito su Android quando si chiama populate () dopo l'aggiunta di tutte le sovrapposizioni. (Naturalmente, il mio primo tentativo è stato quello di chiamare populate () ogni volta dopo l'aggiunta di una sovrapposizione, una tipica errore a causa di tutorial di Google ora sto chiamando populate () solo una volta, dopo che tutti i 2500 + sovrapposizioni sono stati aggiunti alla ItemizedOverlay.. )

Quindi, la chiamata singola populate () prende più di 40 secondi per completare su un dispositivo HTC Hero. Ho dovuto mettere in un indicatore di occupato; nessuna barra di avanzamento è possibile perché non siamo in grado di ottenere tutte le informazioni sullo stato di avanzamento di populate ().

ho provato un'altra soluzione: Non usare ItemizedOverlay ma aggiungere sovrapposizioni a mano, sottoclasse Overlay. Risultato: in effetti è molto più veloce di aggiungere tutte quelle sovrapposizioni alla mappa; tuttavia, la mappa diventa inutilizzabile a causa della costante chiamata del metodo draw () su ogni sovrapposizione. Nel mio metodo draw, ho cercato di ottimizzare il più possibile; Non creo una bitmap ogni volta. Il mio metodo draw () assomiglia a questo:

public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow)  {
// our marker bitmap already includes shadow.
// centerPoint is the geopoint where we need to put the marker.
 if (!shadow) {
  Point point = new Point();  
  mapView.getProjection().toPixels(centerPoint, point);
  canvas.drawBitmap(markerBitmap, point.x, point.y, null);
 }

}

Qui markerBitmap è precalcolate. Non so cos'altro avrei potuto ottimizzare. C'è una sorta di populate () chiamata necessario se non stiamo usando ItemizedOverlay ??? Non riuscivo a trovare nessuna buone risposte per questo.

In questo momento mi ricorrere alla cache del ItemizedOverlay una volta che è stato creato in un thread in background. In questo modo, almeno l'utente non deve aspettare ogni volta.

Per 2 #, non credo che si è risolto nulla. Il tuo codice di difficile lettura sta mostrando come mettere i marcatori sulla sovrapposizione e poi, come aggiungere che overlay alla mappa. Questo è esattamente come lo faccio. Ho mappa con circa 300 alberghi e ci vogliono circa 5 secondi per Android sul mio Nexus One per creare marcatori. Il tutto è in esecuzione con filetto interno ed immagino che dovrò fare una sorta di barra di avanzamento per far sapere all'utente che cosa sta succedendo.

Sto lavorando su un'applicazione che esiste già su iPhone e sembra iPhone non ha problemi a quasi istantaneamente disegnare questi 300 + marcatori. Avrò tempo difficile da spiegare l'esistenza di barra di avanzamento per i miei capi.

Se qualcuno ha idea di come ottimizzare questo processo ... sarò grato.

Ecco il mio codice:

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

So che avrei potuto risparmiare un po 'di tempo, evitando questa conversione String> doppio, ma non mi sento che mi avrebbe dato un notevole risparmio .. o sarebbe?

Per la vostra quarta domanda .... è sufficiente utilizzare il mapOverlays.clear (); metodo e tutti i marcatori precedenti saranno svaniti.

codice:

if(!mapOverlays.isEmpty()) { 
    mapOverlays.clear();
    mapView.invalidate();
}

numero multiplo di oggetti disegnabili può essere aggiunto a una sola sovrapposizione che possono poi essere aggiunto alla mappa. Quindi, il disegno x numero di sovrapposizione per x numero di oggetti wouldnt essere necessario meno gli oggetti sono di diversi tipi. Frammento di codice .. .. Qui, CustomPinPoint è la mia classe, che si estende ItemizedOverlay<OverlayItem>

CustomPinPoint customPinPoint = new CustomPinPoint(drawable, Main.this);

OverlayItem tempOverLayItem = new OverlayItem(
    touchedPoint, "PinPoint", "PintPoint 2"); //Point One
customPinPoint.insertPinPoint(tempOverLayItem);
tempOverLayItem = new OverlayItem(new GeoPoint(
        (int)(-27.34498 * 1E6), (int)(153.00724 * 1E6)), "PinPoint",
    "PintPoint 2"); //Point Two
customPinPoint.insertPinPoint(tempOverLayItem);
overlayList.add(customPinPoint); //Overlay added only once
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top