2013-06-13 22 views
6

Tôi đã bao gồm Bản đồ phố mở trong ứng dụng Android của mình. Trong chế độ xem bản đồ, người dùng sẽ có thể chụp màn hình sau khi bản đồ được tải hoàn toàn. Nhưng hiện tại người dùng có thể chụp ảnh ngay cả khi chế độ xem bản đồ vẫn đang tải. Ai đó có thể cho tôi biết làm thế nào để phát hiện khi mapview được nạp đầy đủ?Phát hiện xem Bản đồ OSM vẫn đang tải hay không trong android

Dưới đây là mã của tôi để nạp 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(); 
    } 

Trả lời

1

Tôi tạo ra một lớp có tên là "MyTileOverlay" bằng cách mở rộng TilesOverlay và nó contins lớp này:

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

Sau đó, khi thiết lập MapView, tôi làm điều này:

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

Như hướng dẫn bởi kurtzmarc, tôi đã sử dụng handleTile() để kiểm tra xem tất cả các ô có đang được tải hay không:

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

Phương pháp này đảm bảo cho dù các thủ tục bốc được hoàn tất hay không:

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

Tôi cũng có thể sử dụng phương pháp này để xác định xem tất cả các gạch đã được nạp hay không:

public int getLoadingBackgroundColor() { 
      return mLoadingBackgroundColor; 
     } 

Hope trợ giúp này một ai đó !

4

Hãy xem TilesOverlayTileLooper thực hiện. Đây là những gì chúng tôi sử dụng để tải và sau đó vẽ từng ô trên màn hình. Trong handleTile(...), chúng tôi cố gắng lấy gạch từ nhà cung cấp lát gạch mTileProvider.getMapTile(pTile). Nếu điều đó trả về một Drawable thì ô được tải, nếu không nó sẽ trả lại null.

Một cách đơn giản để làm điều này là để mở rộng TilesOverlay, ghi đè drawTiles(...) và gọi riêng của bạn TileLooper trước khi gọi super.drawTiles(...) rằng sẽ kiểm tra xem nếu tất cả các gạch mà có được thông qua với handleTile(...) không null. Để sử dụng cuộc gọi TilesOverlay của bạn mMapView.getOverlayManager().setTilesOverlay(myTilesOverlay).

+0

Cảm ơn bạn rất nhiều, bạn có thể vui lòng cung cấp một số mã mẫu cho điều này không? – TharakaNirmana

+0

tôi đã có thể đưa ra một tập hợp các mã như thế này: public class gạch kéo dài TilesOverlay { \t Gạch công cộng (MapTileProviderBase aTileProvider, Bối cảnh aContext) { \t \t siêu (aTileProvider, aContext); \t \t // constructor TODO Auto-tạo còn sơ khai \t} \t \t @ Override \t public void drawTiles (Canvas c, int zoomLevel, int tileSizePx, Rect Viewport) { \t \t // TODO Auto-tạo ra phương pháp còn sơ khai \t \t TileLooper tileloop; \t \t tileloop.handleTile (arg0, arg1, arg2, arg3, arg4) \t \t siêu. – TharakaNirmana

Các vấn đề liên quan