1

マップビューに追加されているオーバーレイを拡張するこのカスタムクラスがあります。このオーバーレイクラスにすべてのポリゴンとテキストを追加するこのクラスが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

あなたがそれを改善することができる多くの方法があります、私はあなたに1つを提案します。

バッファリング: ポリゴンごとに、新しいキャンバスと新しいビットマップを作成します

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

次に、ポリゴンが変更されたときにのみdrawを呼び出し、draw withmyBufferCanvasを呼び出してから、実際のキャンバスでdrawBitmapを呼び出します。

この方法の利点はパフォーマンスです。非常に高速です。欠点はメモリです。ポリゴンが多い場合は、デバイスを強制終了できます。家で再利用してみてください。大丈夫です。再描画せずに、バッファリングされた画像に任意の変換を適用できることを覚えておいてください。

于 2012-08-20T07:19:30.563 に答える
1

MapViewの描画アイテムを管理するには、カスタムのItemizedOverlayを使用する必要があると思います。それはさておき、既存のコードに加えることができるいくつかの変更があり、それは私がそれをスピードアップすると確信しています。draw()メソッドでは、毎回新しいPaintオブジェクトを作成し、それらのプロパティを設定してから破棄します。さらに悪いことに、draw()メソッド内で、ポリゴンリストを2回ループして、さらに多くのPaintオブジェクトまたはTextPaintオブジェクトを作成します。代わりに、オーバーレイが初期化されたときに各ペイントオブジェクトの1つを一度作成し、ループでそれらを再利用できます。また、1つのループですべてを実行できる場合もあります。

于 2012-08-16T18:41:12.700 に答える
0

データを処理し、パスを作成して、最後にマップ上にパスをペイントします。この投稿のTWiStErRobからの応答を参照してください。

于 2012-12-11T12:26:37.477 に答える