2013-06-13 6 views
6

Ho incluso Open Street Maps nella mia applicazione Android. Nella mappa, l'utente dovrebbe essere in grado di catturare lo schermo dopo che la mappa è stata caricata completamente. Ma attualmente l'utente può catturare l'immagine anche quando il mapview è ancora in fase di caricamento. Qualcuno può dirmi come rilevare quando mapview è completamente caricato?Rileva se l'OSM Mapview si sta ancora caricando o no in Android

Qui di seguito è il mio codice per caricare il 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(); 
    } 

risposta

1

ho creato una classe denominata "MyTileOverlay" estendendo TilesOverlay e contins questa classe:

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

Poi durante l'installazione del mapview, faccio questo:

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

Come indicato di kurtzmarc, ho usato handleTile() per verificare se tutti i tiles sono stati caricati o meno:

@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); 
      } 
     } 

Questo metodo assicura che la procedura di caricamento è finalizzato o meno:

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

Posso anche usare questo metodo per identificare se tutte le tessere sono state caricate o meno:

public int getLoadingBackgroundColor() { 
      return mLoadingBackgroundColor; 
     } 

Spero che questo aiuto a qualcuno !

4

Date un'occhiata al TilesOverlay e l'implementazione TileLooper. Questo è ciò che usiamo per caricare e quindi disegnare ogni piastrella sullo schermo. In handleTile(...) tentiamo di ottenere la tessera dal fornitore di tile mTileProvider.getMapTile(pTile). Se quello restituisce un Drawable quindi il riquadro viene caricato, in caso contrario restituirà null.

Un modo semplice per farlo è quello di estendere la TilesOverlay, ignorare drawTiles(...) e chiamare il proprio TileLooper prima di chiamare super.drawTiles(...) che controllerà per vedere se tutte le tessere che vengono passate a handleTile(...) non sono nulli. Per utilizzare la tua chiamata TilesOverlay mMapView.getOverlayManager().setTilesOverlay(myTilesOverlay).

+0

Grazie mille, potresti fornire alcuni codici di esempio per questo? – TharakaNirmana

+0

sono stato in grado di elaborare un insieme di codici come questo: public class Piastrelle estende TilesOverlay { \t Tiles pubblici (MapTileProviderBase aTileProvider, Context aContext) { \t \t super (aTileProvider, aContext); \t \t // TODO costruttore generato automaticamente stub \t} \t \t @Override \t drawTiles public void (Tela c, int zoomLevel, int tileSizePx, Rect finestra) { \t \t // TODO generato automaticamente stub \t \t TileLooper tileloop; \t \t tileloop.handleTile (arg0, arg1, arg2, arg3, arg4) \t \t super.drawTiles (c, zoomLevel, tileSizePx, viewPort); \t} } per favore fatemi sapere come procedere. Grazie! – TharakaNirmana

Problemi correlati