2012-03-28 4 views
1

私は多くのオーバーレイを含むMapViewを持っています。これに対して、オーバーレイクラスはItemizedOverlayよりも優れたパフォーマンスを持っていると聞いているので、オーバーレイクラスを拡張しました。 マップが移動したり、ズーム、MapActivityにされたとき、私はのみ表示ドローアブルを選択して、私が呼ぶ:オーバーレイを使用したMapViewにはパフォーマンスの問題があります

protected void RefreshOverlay() { 
    Log.e("||||||||||||||||||||||||||", "RefrashOverlay()"); 
    mapOverlays.clear(); 
    mapOverlays.add(new OverlayElements(zonesP,getApplicationContext())); 

}

クラスOverlayElementsオーバーレイを拡張し、ここで私は、すべての図面を実行します。

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に戻す必要がありますか?もしそうなら、どうやって一度だけデータを呼び出すことができますか?どのような最適化の考えですか?ありがとうございました!! :)

+0

まず、アイテムの* all *が用意されているまで、 'ItemizedOverlay'に' populate() 'を呼び出さないでください。次に、Traceviewを使ってあなたの時間がどこに費やされているかを判断し、コードを最適化する方法をよりよく知ることができます。 – CommonsWare

+0

まあ、ええ、私はマップ上に同様のdrawablesを持っているとき、私は一度だけpopulate()を呼び出すが、主に私は異なるものを持っています。私はすでにプロファイラを使用していましたが、ほとんどの場合(マップの移動またはズームで)、BitmapFactory.nativeDecodeAsset、GC、DrawBitmap、GCがあります。ヒントありがとう! :) – Misca

+0

"マップ上に同様のドロウアブルがあるときは、一度しかpopulate()を呼び出しませんが、大部分は別のものがあります" - それは問題ではありません。 – CommonsWare

答えて

1

ItemizedOverlayには、各アイテムではなく、すべてのアイテムが用意できるまで、populate()を呼んではいけません。私は地図上で同様のドローアブルを持っている場合

、私は一度だけ移入コール()が、ほとんど私は問題ではない別のもの

を持っています。

新しいItemizedOverlayを作成せずに新しいドロウアブルを追加するにはどうすればよいですか?

OverlayItemのカスタムサブクラスでgetMarker()を上書きします。 Here is a sample project demonstrating thisで、実行時に異なるイメージ間でドロアブルが切り替えられます。

関連する問題