2012-03-28 11 views
1

Ich habe eine MapView, die viele Overlays enthalten wird. Dafür habe ich die Overlay-Klasse erweitert, da ich gehört habe, dass sie eine bessere Leistung hat als ItemizedOverlay (das für jedes Element populate aufruft). Wenn die Karte verschoben oder gezoomt, in der MapActivity, wähle ich nur die sichtbaren Drawables und ich rufe:MapView mit Overlay hat Leistungsprobleme

protected void RefreshOverlay() { 
    Log.e("||||||||||||||||||||||||||", "RefrashOverlay()"); 
    mapOverlays.clear(); 
    mapOverlays.add(new OverlayElements(zonesP,getApplicationContext())); 

}

Die Klasse OverlayElements Overlay erweitert und hier ich alle Zeichnungen tun:

public void draw(Canvas canvas, MapView mapview, boolean shadow) { 
    super.draw(canvas, mapview, shadow); 
    int i; 
    int sz=zonesP.size(); 
    int style; 
    ZoneProperties zone; 

    //paint.setAntiAlias(true); 
    pp = new Point(); 
    int zoomLevelC=mapview.getZoomLevel(); 
    Projection pr = mapview.getProjection(); 
    for(i=0;i<sz;i++) 
    { 
     zone=zonesP.get(i); 
     if(zone.visible==true) 
     { 
      pr.toPixels(zone.point, pp); 
      xp = pp.x; 
      yp = pp.y; 
      if(zone.zoneSizePx<500) 
      { 
       //---------- 
       Log.e("zone radious>>",zone.zoneSizePx+"<<");             
       int alfa; 


       style=(int)i%2; 
       Log.e("style>>",i+">>"+r[i]+" "+g[i]+" "+b[i]); 
       paint.setColor(Color.rgb(r[style],g[style],b[style]));       
       alfa=(18-zoomLevelC)*35; 
       if(alfa>255) 
        alfa = 200; 
       else 
        if(alfa<0) alfa = 20; 
       paint.setAlpha(alfa); 


       canvas.drawCircle(xp, yp, zone.zoneSizePx, paint); 


      } 
      if(zone.select!=0) 
      if(zone.vState==2) 
       canvas.drawBitmap(getDrawRes(zone.select,zone.eSizePx),xp,yp,null); 
     } 
     //----------------   
    } 
} 

Nun ja, diese Zeichnung ist nicht so schnell :). Sollte ich zurück ItemizedOverlay, und wenn ja, wie kann ich den Anruf nur einmal ausfüllen? Irgendeine Optimierungsidee? Vielen Dank!! :)

+0

Zuerst rufen Sie 'populate()' nicht auf einem 'ItemizedOverlay' auf, bis * all * der Elemente bereit sind, nicht für jedes Element. Zweitens, verwenden Sie TraceView, um festzustellen, wo Ihre Zeit verbracht wird, damit Sie besser wissen, wie Sie Ihren Code optimieren können. – CommonsWare

+0

Nun, ja, wenn ich ähnliche Zeichen auf der Karte habe, rufe ich nur einmal auf(), aber meistens habe ich andere. Ich habe den Profiler bereits benutzt und die meiste Zeit habe ich (auf der Karte verschieben oder zoomen): BitmapFactory.nativeDecodeAsset, GC, DrawBitmap, GC. Danke für die Tipps! :) – Misca

+0

"Wenn ich ähnliche Zeichen auf der Karte habe, rufe ich nur einmal auf(), aber meistens habe ich unterschiedliche" - das ist egal. – CommonsWare

Antwort

1

Sie rufen nicht populate() auf einem ItemizedOverlay, bis alle Elemente bereit sind, nicht für jeden Artikel.

, wenn ich ähnliche Drawables auf der Karte haben, rufe ich bevölkern nur einmal(), aber meistens habe ich anderes

Das spielt keine Rolle.

Wie kann ich ein neues Zeichen hinzufügen, ohne ein neues ItemizedOverlay zu erstellen?

Überschreiben getMarker() in einer benutzerdefinierten Unterklasse von OverlayItem. , wobei der Zeichensatz zur Laufzeit zwischen verschiedenen Bildern umgeschaltet wird.