【问题标题】:MapView with Overlay has performance issues带有 Overlay 的 MapView 存在性能问题
【发布时间】:2012-03-28 08:41:49
【问题描述】:

我有一个包含大量叠加层的 MapView。为此,我扩展了 Overlay 类,因为我听说它比 ItemizedOverlay 具有更好的性能(即为每个元素调用填充)。 当地图移动或缩放时,在 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,如果是这样,我怎样才能只进行一次填充调用?有什么优化思路吗?谢谢!! :)

【问题讨论】:

  • 首先,在所有项都准备好之前,不要在ItemizedOverlay 上调用populate(),而不是针对每个项。其次,使用 Traceview 来确定您的时间都花在了哪些地方,这样您就可以更好地了解如何优化您的代码。
  • 嗯,是的,当我在地图上有类似的可绘制对象时,我只调用一次 populate() 但大多数情况下我有不同的。我已经使用了探查器,而且大部分时间我都有(在地图上移动或缩放):BitmapFactory.nativeDecodeAsset、GC、DrawBitmap、GC。感谢您的小费! :)
  • “当我在地图上有类似的可绘制对象时,我只调用一次 populate() 但大多数情况下我有不同的”——没关系。
  • 我明白了,这就是我要寻找的。但我真的不知道该怎么做,因为当我创建一个新的 ItemizedOverlay 时,在构造函数中我首先调用 super(boundCenter(Marker));并且 addOverlay(OverlayItem overlay) 与新的可绘制对象无关。如何在不创建新的 ItemizedOverlay 的情况下添加新的可绘制对象?也许你想知道答案。
  • "如何在不创建新的 ItemizedOverlay 的情况下添加新的可绘制对象?" -- 在OverlayItem 的自定义子类中覆盖getMarker()。这是一个示例项目,演示了这一点,其中可绘制在运行时在不同图像之间切换:github.com/commonsguy/cw-advandroid/tree/master/Maps/…

标签: android android-mapview


【解决方案1】:

在所有项目都准备好之前,不要在 ItemizedOverlay 上调用 populate(),而不是每个项目。

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

没关系。

如何在不创建新的 ItemizedOverlay 的情况下添加新的可绘制对象?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2014-09-13
    • 2018-04-01
    相关资源
    最近更新 更多