2012-03-28 5 views
1

많은 오버레이가 포함될 MapView가 있습니다. 이를 위해 Overlay 클래스를 확장했는데 ItemizedOverlay (모든 요소에 대해 채우기를 호출하는 것)보다 성능이 우수하다고 들었습니다. 내가 모든 도면을 여기오버레이가있는 MapView에는 성능 문제가 있습니다.

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

}

클래스 OverlayElements가 오버레이 확장 :지도를 이동하거나 확대 할 때 의 MapActivity에서, 난 단지 눈에 보이는 드로어 블을 선택하고 내가 전화

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

먼저 항목의 * all *이 준비 될 때까지'ItemizedOverlay'에'populate()'를 호출하지 말고 각 항목을 준비하십시오. 둘째, Traceview를 사용하여 시간을 어디에서 사용했는지 확인하십시오. 따라서 코드를 최적화하는 방법을 더 잘 알 수 있습니다. – CommonsWare

+0

글쎄, 예,지도에 비슷한 드로어 블이있을 때, 나는 한 번만 populate()를 호출하지만 대부분 다른 것들을 가지고 있습니다. 나는 이미 프로파일 러를 사용했고 대부분의 경우 (맵 이동 또는 확대/축소) : BitmapFactory.nativeDecodeAsset, GC, DrawBitmap, GC. 팁 주셔서 감사합니다! :) – Misca

+0

"지도에서 비슷한 드로어 블을 사용하면 한 번만 채 웁니다 (하지만 대부분은 다른 것이 있습니다) - 그건 중요하지 않습니다. – CommonsWare

답변

1

ItemizedOverlaypopulate()은 각 항목이 아니라 모든 항목이 준비 될 때까지 호출하지 마십시오. 내가지도에 유사한 드로어 블이있을 때

, 내가 한 번만 채울 호출()하지만 대부분 내가 문제가되지 않습니다 다른 하나

있습니다.

새 ItemizedOverlay를 만들지 않고 어떻게 새로운 드로어 블을 추가 할 수 있습니까?

OverlayItem의 맞춤 하위 클래스에서 getMarker()을 재정의하십시오. Here is a sample project demonstrating this, 여기서 드로어 블은 런타임에 다른 이미지 사이에서 토글됩니다.

관련 문제