2013-06-13 11 views
6

Mam włączone mapy ulic otwartych w mojej aplikacji na Androida. W widoku mapy użytkownik powinien być w stanie przechwycić ekran po pełnym załadowaniu mapy. Ale obecnie użytkownik może przechwytywać obraz nawet wtedy, gdy widok mapy wciąż się ładuje. Czy ktoś może mi powiedzieć, jak wykryć, kiedy widok mapy jest w pełni załadowany?Wykryj, czy widok mapy OSM wciąż się ładuje, czy nie, w Androidzie

Poniżej jest mój kod, aby załadować 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(); 
    } 

Odpowiedz

1

Stworzyłem klasę o nazwie "MyTileOverlay" poprzez rozszerzenie TilesOverlay i contins tej klasy:

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

Następnie podczas konfigurowania MapView, mogę to zrobić:

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

Jak polecił przez kurtzmarc, użyłem handleTile(), aby sprawdzić, czy wszystkie płytki są ładowane czy nie:

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

Ta metoda zapewnia, czy procedura ładowania jest zamknięta lub nie:

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

mogę również użyć tej metody, aby określić, czy wszystkie płytki zostały załadowane czy nie:

public int getLoadingBackgroundColor() { 
      return mLoadingBackgroundColor; 
     } 

nadzieję, że to komuś pomóc !

4

przyjrzeć TilesOverlay oraz wdrożenie TileLooper. To jest to, czego używamy, aby załadować, a następnie narysować każdy kafelek na ekranie. W handleTile(...) próbujemy uzyskać kafelek od dostawcy płytek mTileProvider.getMapTile(pTile). Jeśli to zwróci wartość Drawable, wówczas płytka zostanie załadowana, jeśli nie, zwróci null.

Prostym sposobem na to jest rozszerzenie TilesOverlay, zastępują drawTiles(...) i nazwać swoim własnym TileLooper przed wywołaniem super.drawTiles(...) że sprawdzi, czy wszystkie płytki, które przejdzie do handleTile(...) nie są nieważne. Aby użyć połączenia z TilesOverlay, należy zadzwonić pod numer mMapView.getOverlayManager().setTilesOverlay(myTilesOverlay).

+0

Dziękuję bardzo, czy mógłbyś podać kilka przykładowych kodów dla tego? – TharakaNirmana

+0

byłem w stanie wymyślić zestaw kodów tak: public class Płytki rozciąga TilesOverlay { \t Płytki publicznych (MapTileProviderBase aTileProvider, kontekst aContext) { \t \t Super (aTileProvider, aContext); \t \t // Do zrobienia Automatycznie generowane konstruktor skrótową \t} \t \t @Override \t publicznych pustych drawTiles (Płótno C int zoomlevel int tileSizePx, Rect rzutnia) { \t \t // Do zrobienia Automatycznie generowane metodą en \t \t TileLooper tileloop; \t tileloop.handleTile (arg0, arg1, arg2, arg3, arg4) \t \t super.drawTiles (c, zoomLevel, tileSizePx, viewPort); \t} } proszę dać mi znać, jak postępować. Dzięki! – TharakaNirmana

Powiązane problemy