MapView с наложением имеет проблемы с производительностью - PullRequest
1 голос
/ 28 марта 2012

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

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, и если да, то как я могу сделать вызов заполнить только один раз? Есть идеи по оптимизации? Спасибо!! :)

1 Ответ

1 голос
/ 03 апреля 2012

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

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

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

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

Переопределить getMarker() в пользовательском подклассе OverlayItem. Вот пример проекта, демонстрирующего этот , где рисование переключается между различными изображениями во время выполнения.

...