@Override public void draw(final Canvas c, final MapView mapView, final boolean shadow) { if (shadow) { return; } // If map views is animating, don't update, scale will be wrong. if (mapView.isAnimating()) { return; } final int zoomLevel = mapView.getZoomLevel(); if (zoomLevel >= minZoom) { final Projection projection = mapView.getProjection(); if (projection == null) { return; } final IGeoPoint center = projection.fromPixels((screenWidth / 2), screenHeight / 2); if (zoomLevel != lastZoomLevel || (int) (center.getLatitudeE6() / 1E6) != (int) (lastLatitude / 1E6)) { lastZoomLevel = zoomLevel; lastLatitude = center.getLatitudeE6(); createScaleBarPicture(mapView); } mBounds.set(projection.getScreenRect()); mBounds.offset((int) xOffset, (int) yOffset); mBounds.set( mBounds.left, mBounds.top, mBounds.left + scaleBarPicture.getWidth(), mBounds.top + scaleBarPicture.getHeight()); c.drawPicture(scaleBarPicture, mBounds); } }
@Override protected void draw(final Canvas pC, final MapView pOsmv, final boolean shadow) { if (shadow) { return; } // Don't draw if we are animating if (pOsmv.isAnimating()) { return; } // Calculate the half-world size final Projection projection = pOsmv.getProjection(); final int zoomLevel = projection.getZoomLevel(); mWorldSize_2 = TileSystem.MapSize(zoomLevel) / 2; // Save the Mercator coordinates of what is on the screen mViewportRect.set(projection.getScreenRect()); mViewportRect.offset(mWorldSize_2, mWorldSize_2); // Start calculating the tile area with the current viewport mTileArea.set(mViewportRect); // Get the target zoom level difference. int miniMapZoomLevelDifference = getZoomDifference(); // Make sure the zoom level difference isn't below the minimum zoom level if (zoomLevel - getZoomDifference() < mTileProvider.getMinimumZoomLevel()) { miniMapZoomLevelDifference += zoomLevel - getZoomDifference() - mTileProvider.getMinimumZoomLevel(); } // Shift the screen coordinates into the target zoom level mTileArea.set( mTileArea.left >> miniMapZoomLevelDifference, mTileArea.top >> miniMapZoomLevelDifference, mTileArea.right >> miniMapZoomLevelDifference, mTileArea.bottom >> miniMapZoomLevelDifference); // Limit the area we are interested in for tiles to be the MAP_WIDTH by MAP_HEIGHT and // centered on the center of the screen mTileArea.set( mTileArea.centerX() - (getWidth() / 2), mTileArea.centerY() - (getHeight() / 2), mTileArea.centerX() + (getWidth() / 2), mTileArea.centerY() + (getHeight() / 2)); // Get the area where we will draw the minimap in screen coordinates mMiniMapCanvasRect.set( mViewportRect.right - getPadding() - getWidth(), mViewportRect.bottom - getPadding() - getHeight(), mViewportRect.right - getPadding(), mViewportRect.bottom - getPadding()); mMiniMapCanvasRect.offset(-mWorldSize_2, -mWorldSize_2); // Draw a solid background where the minimap will be drawn with a 2 pixel inset pC.drawRect( mMiniMapCanvasRect.left - 2, mMiniMapCanvasRect.top - 2, mMiniMapCanvasRect.right + 2, mMiniMapCanvasRect.bottom + 2, mPaint); super.drawTiles( pC, projection.getZoomLevel() - miniMapZoomLevelDifference, TileSystem.getTileSize(), mTileArea); }