2013-06-13 10 views
6

私はアンドロイドアプリケーションにオープンストリートマップを含めました。マップビューでは、地図が完全に読み込まれた後に画面をキャプチャできるはずです。しかし、現在、ユーザーは地図ビューがまだロードされていても画像をキャプチャすることができます。誰かがマップビューが完全に読み込まれたときを検出する方法を教えてもらえますか?以下はOSM Mapviewがまだアンドロイドに読み込まれているかどうかを検出します

はMapViewのをロードするための私のコードです:

public class MainActivity extends Activity { 
    MapView mapView; 
    MyLocationOverlay myLocationOverlay = null; 
    ArrayList<OverlayItem> anotherOverlayItemArray; 
    protected ItemizedOverlayWithBubble<ExtendedOverlayItem> itineraryMarkers; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mapView = (MapView) findViewById(R.id.mapview); 

     final ArrayList<ExtendedOverlayItem> waypointsItems = new ArrayList<ExtendedOverlayItem>(); 
     itineraryMarkers = new ItemizedOverlayWithBubble<ExtendedOverlayItem>(this, waypointsItems, mapView, new ViaPointInfoWindow(R.layout.itinerary_bubble, mapView)); 
     mapView.getOverlays().add(itineraryMarkers); 

     mapView.setTileSource(TileSourceFactory.MAPNIK); 
     mapView.setBuiltInZoomControls(true); 
     MapController mapController = mapView.getController(); 
     mapController.setZoom(1); 
     GeoPoint point2 = new GeoPoint(51496994, -134733); 
     mapController.setCenter(point2); 

     Drawable marker=getResources().getDrawable(android.R.drawable.star_big_on); 
     GeoPoint myPoint1 = new GeoPoint(0*1000000, 0*1000000); 
     ExtendedOverlayItem overlayItem = new ExtendedOverlayItem("Title Test Loc", "Desc", myPoint1, this); 
     overlayItem.setMarkerHotspot(OverlayItem.HotspotPlace.BOTTOM_CENTER); 
     overlayItem.setMarker(marker); 
     overlayItem.setRelatedObject(0); 
     itineraryMarkers.addItem(overlayItem); 
     mapView.invalidate(); 



     myLocationOverlay = new MyLocationOverlay(this, mapView); 
     mapView.getOverlays().add(myLocationOverlay); 
     myLocationOverlay.enableMyLocation(); 

     myLocationOverlay.runOnFirstFix(new Runnable() { 
      public void run() { 
      mapView.getController().animateTo(myLocationOverlay.getMyLocation()); 
       } 
      }); 


    } 

    @Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 
     myLocationOverlay.enableMyLocation(); 
     myLocationOverlay.enableCompass(); 
     myLocationOverlay.enableFollowLocation(); 
    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     myLocationOverlay.disableMyLocation(); 
     myLocationOverlay.disableCompass(); 
     myLocationOverlay.disableFollowLocation(); 
    } 

答えて

1

私はTilesOverlayを拡張することにより、 "MyTileOverlay" という名前のクラスを作成し、それがこのクラスをcontins:

https://code.google.com/p/osmdroid/source/browse/trunk/osmdroid-android/src/main/java/org/osmdroid/views/overlay/TilesOverlay.java?r=1086

のMapViewを設定するときに、私はこれを実行します。指示通り

this.mTilesOverlay = new MyTileOverlay(mProvider, this.getBaseContext()); 

をkurtzmarcによってhandleTile()を使用して、すべてのタイルがロードされているかどうかを確認しました:

@Override 
     public void handleTile(final Canvas pCanvas, final int pTileSizePx, 
       final MapTile pTile, final int pX, final int pY) { 
      Drawable currentMapTile = mTileProvider.getMapTile(pTile); 
      if (currentMapTile == null) { 
       currentMapTile = getLoadingTile(); 
       Log.d("Tile Null", "Null"); 
      } else { 

       Log.d("Tile Not Null", "Not Null"); 
      } 

      if (currentMapTile != null) { 
       mTileRect.set(pX * pTileSizePx, pY * pTileSizePx, pX 
         * pTileSizePx + pTileSizePx, pY * pTileSizePx 
         + pTileSizePx); 
       onTileReadyToDraw(pCanvas, currentMapTile, mTileRect); 
      } 

      if (DEBUGMODE) { 
       mTileRect.set(pX * pTileSizePx, pY * pTileSizePx, pX 
         * pTileSizePx + pTileSizePx, pY * pTileSizePx 
         + pTileSizePx); 
       mTileRect.offset(-mWorldSize_2, -mWorldSize_2); 
       pCanvas.drawText(pTile.toString(), mTileRect.left + 1, 
         mTileRect.top + mDebugPaint.getTextSize(), 
         mDebugPaint); 
       pCanvas.drawLine(mTileRect.left, mTileRect.top, 
         mTileRect.right, mTileRect.top, mDebugPaint); 
       pCanvas.drawLine(mTileRect.left, mTileRect.top, 
         mTileRect.left, mTileRect.bottom, mDebugPaint); 
      } 
     } 

この方法では、ロード手順が確定されているかどうかを保証しますか:

@Override 
      public void finaliseLoop() { 
       Log.d("Loop Finalized", "Finalized"); 
      } 

私はまた、すべてのタイルがロードされたか否かを識別するために、このメソッドを使用することができます。

public int getLoadingBackgroundColor() { 
      return mLoadingBackgroundColor; 
     } 

・ホープこれは誰かを助けます!

4

TilesOverlayを見て、TileLooper実装してください。これは、各タイルを読み込んで画面に描画するために使用されます。 handleTile(...)では、タイルプロバイダmTileProvider.getMapTile(pTile)からタイルを取得しようとしています。それがDrawableを返した場合は、タイルがロードされていない場合は、nullが返されます。これを行うには

簡単な方法は、drawTiles(...)をオーバーライドし、handleTile(...)に渡されるすべてのタイルがnullでないかどうかをチェックしますsuper.drawTiles(...)を呼び出す前に、独自のTileLooperを呼び出し、TilesOverlayを拡張することです。あなたのTilesOverlayコールを使用するにはmMapView.getOverlayManager().setTilesOverlay(myTilesOverlay)

+0

ありがとうございます。これにはいくつかのサンプルコードを用意してください。 – TharakaNirmana

+0

私はこのようなコードのセットを思い付くことができた:パブリッククラスタイルはTilesOverlay { \t公共タイル(MapTileProviderBase aTileProvider、コンテキストaContext){ \t \tスーパー(aTileProvider、aContext)に延びています。 \t \t // TODO自動生成コンストラクタスタブ \t} \t \t @Override \t公共ボイドdrawTiles(キャンバスC、INT zoomLevel、INT tileSizePx、ビューポートのRect){ \t \t // TODO自動生成方法スタブT35 (arg0、arg1、arg2、arg3、arg4) \t \t super。drawTiles(c、zoomLevel、tileSizePx、viewPort); \t} } 進め方を教えてください。ありがとう! – TharakaNirmana

関連する問題