带Overlay的MapView存在性能问题

时间:2012-03-28 08:41:50

标签: android android-mapview

我有一个包含很多叠加层的MapView。为此,我已经扩展了Overlay类,因为我听说它比ItemizedOverlay具有更好的性能(即为每个元素调用populate)。 移动或缩放地图时,在MapActivity中,我只选择可见的drawable,然后调用:

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 个答案:

答案 0 :(得分:1)

在所有项目准备就绪之前,您不会在populate()上致电ItemizedOverlay,而不是针对每件商品。

  

当我在地图上有类似的drawable时,我只调用一次populate(),但大多数情况下我有不同的

那没关系。

  

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

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