2012-03-28 67 views
1

我有一个MapView将包含大量的叠加层。为此,我已经扩展了Overlay类,因为我听说它比ItemizedOverlay有更好的性能(这是为每个元素调用填充)。 在地图上移动或放大,在MapActivity,我只选择可见绘项目,我呼吁:具有叠加层的MapView有性能问题

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

}

类OverlayElements扩展叠加,在这里,我做的所有图纸:

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

嗯,是此图是不是快:)。 我应该回去ItemizedOverlay,如果是的话我怎么能只填充一次调用?任何优化的想法?谢谢!! :)

+0

首先,你不叫'填入()'上'ItemizedOverlay'直到*所有*的项目都准备好了,不适合每个项目。其次,使用Traceview来确定你的时间花在哪里,所以你更好地了解如何优化你的代码。 – CommonsWare 2012-03-28 11:35:11

+0

好吧,是的,当我在地图上有类似的drawable时,我只调用一次populate(),但大多数情况下我有不同的drawable。我已经使用过探查器和大部分时间(在地图上移动或缩放):BitmapFactory.nativeDecodeAsset,GC,DrawBitmap,GC。感谢您的小费! :) – Misca 2012-03-28 12:14:02

+0

“当我在地图上有类似的drawable时,我只调用一次populate(),但大多数情况下我有不同的一个” - 这并不重要。 – CommonsWare 2012-03-28 12:30:23

回答

1

您不要在ItemizedOverlay上拨打populate(),直到所有项目都准备好,而不是每个项目。

时我已经在地图类似绘图资源,我调用一次填充(),但主要是我有不同的一个

这不要紧。

如何在不创建新的ItemizedOverlay的情况下添加新的drawable?

OverlayItem的自定义子类中重写getMarker()Here is a sample project demonstrating this,其中drawable在运行时在不同的图像之间切换。