1

我有这个自定义类,它扩展了添加到我的地图视图中的叠加层。我只有一个将我所有的多边形和文本添加到这个覆盖类中的类。但是,这会导致地图视图非常缓慢。我添加了一个绘图整数并测试了每次调用 ondraw 函数时这个类将绘制 84 次。是否有任何解决方案有助于降低地图视图的加载速度?现在地图视图很慢,每次我左右移动甚至缩放都会很慢。查看android catlog,在我看来,覆盖类ondraw 每秒都被调用一次?我应该查看另一种类型的图层而不是使用叠加层吗?

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) 
{
    shadow=false;
    int numberofdraw= 0;




    //outline 
    Paint paint = new Paint();
    paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setStrokeWidth(2);
    //paint.setColor(0x10000000);    
    paint.setColor(Color.BLACK); 
    paint.setStyle(Paint.Style.STROKE);
    paint.setAntiAlias(true);
    Point point1_draw = new Point();     

    for (int i =0;i<data.getCustomPolygonList().size();i++)
    {

        CustomPolygon customPolygon= data.getCustomPolygonList().get(i);
        Path path = new Path();
        path.setFillType(Path.FillType.EVEN_ODD);
        for(int n=0;n<customPolygon.getCorrdinateList().size();n++)
        {

            GeoPoint sector1 = new GeoPoint((int)(customPolygon.getCorrdinateList().get(n).getLatitude()*1e6), (int)((customPolygon.getCorrdinateList().get(n).getLongitude())*1e6));
            if(n==0){
                mapView.getProjection().toPixels(sector1, point1_draw);
                path.moveTo(point1_draw.x,point1_draw.y);
            }else
            {
                mapView.getProjection().toPixels(sector1, point1_draw);
                path.lineTo(point1_draw.x,point1_draw.y);
            }
        }

        path.close();
        canvas.drawPath(path, paint);
        numberofdraw++;
        //  canvas.clipPath(path, Op.DIFFERENCE);

    }


    //inside sector color
    for (int i =0;i<data.getCustomPolygonList().size();i++)
    {
        CustomPolygon customPolygon= data.getCustomPolygonList().get(i);
        paint = new Paint();
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setStrokeWidth(2);
        paint.setColor(0x186666ff);    
        //paint.setColor(customPolygon.getColor()); 
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setAntiAlias(true);
        point1_draw = new Point();     
        Path path = new Path();
        path.setFillType(Path.FillType.EVEN_ODD);
        for(int n=0;n<customPolygon.getCorrdinateList().size();n++)
        {

            GeoPoint sector1 = new GeoPoint((int)(customPolygon.getCorrdinateList().get(n).getLatitude()*1e6), (int)((customPolygon.getCorrdinateList().get(n).getLongitude())*1e6));
            if(n==0){
                mapView.getProjection().toPixels(sector1, point1_draw);
                path.moveTo(point1_draw.x,point1_draw.y);
            }else
            {
                mapView.getProjection().toPixels(sector1, point1_draw);
                path.lineTo(point1_draw.x,point1_draw.y);
            }
        }

        path.close();
        numberofdraw++;
        canvas.drawPath(path, paint);

    }



    //inside sector text
    for (int i =0;i<data.getCustomPolygonList().size();i++)
    {
        CustomPolygon customPolygon= data.getCustomPolygonList().get(i);
        TextPaint paintText = new TextPaint();
        Point   point1 = new Point();     
        String text=customPolygon.getName();

        for(int n=0;n<customPolygon.getCorrdinateList().size();n++)
        {
            if(customPolygon.getTextLocation()!=null)
            {
                paintText.setTextSize(24);
                Rect rect = new Rect();
                paintText.getTextBounds(text, 0, text.length(), rect);
                paintText.setTextAlign(Paint.Align.CENTER);

                paintText.setTypeface(Typeface.DEFAULT_BOLD); 

                paintText.setColor(Color.BLACK);

                GeoPoint sector1 = new GeoPoint((int)(customPolygon.getTextLocation().getLatitude()*1e6), (int)((customPolygon.getTextLocation().getLongitude())*1e6));


                mapView.getProjection().toPixels(sector1, point1);

            }
        }

        numberofdraw++;
        canvas.drawText(text, point1.x, point1.y, paintText);
    }



    Log.e(Config.log_id,"draw no. "+    numberofdraw+"");
}
4

3 回答 3

3

有很多方法可以改进它,我会建议你一种。

缓冲: 为每个多边形创建一个新的画布和一个新的位图

Canvas myBufferCanvas;
Bitmap myBufferBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
myBufferCanvas = new Canvas(myBufferBitmap);

然后只在多边形改变时调用draw,调用draw,myBufferCanvas然后在真实画布上调用drawBitmap。

这种方法的优点是性能,它会非常快!缺点是内存,如果你有很多多边形,你可以杀死设备。试着在家里重复使用它们,你会没事的。请记住,您可以对缓冲图像应用任何转换,而无需重绘它。

于 2012-08-20T07:19:30.563 回答
1

我认为您应该使用自定义 ItemizedOverlay 来管理 MapView 上的绘图项。除此之外,您可以对现有代码进行一些更改,我相信这会加快速度。在您的 draw() 方法中,您每次都在创建新的 Paint 对象,设置它们的属性,然后处理它们。更糟糕的是,在 draw() 方法中,您循环遍历多边形列表两次,创建更多的 Paint 对象或 TextPaint 对象。相反,您可以在 Overlay 初始化时创建每个 Paint 对象之一,然后在循环中重新使用它们。您也可以在一个循环中完成所有操作。

于 2012-08-16T18:41:12.700 回答
0

处理数据,然后构建路径,最后在地图上绘制路径,请参阅本文中 TWiStErRob 的响应

于 2012-12-11T12:26:37.477 回答