2012-03-28 2 views
1

У меня есть MapView, который будет содержать много наложений. Для этого я расширил класс Overlay, поскольку я слышал, что он имеет лучшую производительность, чем ItemizedOverlay (который вызывал заполнение для каждого элемента). Когда карта перемещается или увеличено, в MapActivity, я выбираю только видимый вводимый коэффициент и зову:MapView с Overlay имеет проблемы с производительностью

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

}

Класса OverlayElements расширяет Overlay и здесь я делаю все рисунки:

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

Во-первых, вы не называете 'populate()' на 'ItemizedOverlay', пока * все * элементов не готовы, а не для каждого элемента. Во-вторых, используйте Traceview, чтобы определить, где ваше время тратится, поэтому вы лучше знаете, как оптимизировать свой код. – CommonsWare

+0

Ну, да, когда у меня есть похожие рисунки на карте, я вызываю только один раз populate(), но в основном у меня разные. Я уже использовал профилировщик и большую часть времени (на карте перемещаю или увеличиваю): BitmapFactory.nativeDecodeAsset, GC, DrawBitmap, GC. Спасибо за советы! :) – Misca

+0

«когда у меня есть похожие рисунки на карте, я вызываю только один раз заселять(), но в основном у меня разные» - это не имеет значения. – CommonsWare

ответ

1

Вы не вызываете populate() на ItemizedOverlay, пока все предметы не готовы, а не для каждого элемента.

, когда у меня есть похожий на вводимый коэффициент карты, я называю только один раз заполнить(), но в основном у меня есть другой один

Это не имеет значения.

Как я могу добавить новый чертеж без создания нового ItemizedOverlay?

Переопределить getMarker() в пользовательском подклассе OverlayItem. Here is a sample project demonstrating this, где выталкиваемый переключается между различными изображениями во время выполнения.

Смежные вопросы