diff options
| author | campbeb <bpcampbell@gmail.com> | 2012-05-22 14:14:08 -1000 |
|---|---|---|
| committer | campbeb <bpcampbell@gmail.com> | 2012-05-22 14:14:08 -1000 |
| commit | 3c23e89952eb834fcb71fc6d869ecd3b7eb4d87c (patch) | |
| tree | 309d814222463f1e6431ec2262ef949384ff56ce /main/src | |
| parent | 4453f08ccda762f1c608feaf6cf379d1ffa93df4 (diff) | |
| download | cgeo-3c23e89952eb834fcb71fc6d869ecd3b7eb4d87c.zip cgeo-3c23e89952eb834fcb71fc6d869ecd3b7eb4d87c.tar.gz cgeo-3c23e89952eb834fcb71fc6d869ecd3b7eb4d87c.tar.bz2 | |
Fix offline zoom issue and document zoom level differences
Google Maps and OSM Maps use different zoom levels for the same
view ranges. This is better documented. Additionally, this change
fixes zooming out causing zoom in (Issue #1485).
Diffstat (limited to 'main/src')
6 files changed, 56 insertions, 14 deletions
diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index 25bc80c..30d4242 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -916,7 +916,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto if (mapView != null) { // get current viewport final Viewport viewportNow = mapView.getViewport(); - int zoomNow = mapView.getMapZoomLevel(); + // Since zoomNow is used only for local comparison purposes, + // it is ok to use the Google Maps compatible zoom level of OSM Maps + final int zoomNow = mapView.getMapZoomLevel(); // check if map moved or zoomed //TODO Portree Use Rectangle inside with bigger search window. That will stop reloading on every move diff --git a/main/src/cgeo/geocaching/maps/google/GoogleMapView.java b/main/src/cgeo/geocaching/maps/google/GoogleMapView.java index 55a6167..c575177 100644 --- a/main/src/cgeo/geocaching/maps/google/GoogleMapView.java +++ b/main/src/cgeo/geocaching/maps/google/GoogleMapView.java @@ -56,7 +56,7 @@ public class GoogleMapView extends MapView implements MapViewImpl { @Override public void draw(Canvas canvas) { try { - if (getMapZoomLevel() >= 22) { // to avoid too close zoom level (mostly on Samsung Galaxy S series) + if (getMapZoomLevel() > 22) { // to avoid too close zoom level (mostly on Samsung Galaxy S series) getController().setZoom(22); } diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapController.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapController.java index db81609..5aaecc8 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapController.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapController.java @@ -26,13 +26,15 @@ public class MapsforgeMapController implements MapControllerImpl { mapController.setCenter((GeoPoint) geoPoint); } + /** + * Set the map zoom level to mapzoom-1 or maxZoomLevel, whichever is least + * mapzoom-1 is used to be compatible with Google Maps zoom levels + */ @Override public void setZoom(int mapzoom) { - int mfzoom = mapzoom - 1; - if (mfzoom > maxZoomLevel) { - mfzoom = maxZoomLevel; - } - mapController.setZoom(mfzoom); + // Google Maps and OSM Maps use different zoom levels for the same view. + // All OSM Maps zoom levels are offset by 1 so they match Google Maps. + mapController.setZoom(Math.min(mapzoom - 1, maxZoomLevel)); } @Override diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java index 1649510..08b9c0f 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java @@ -51,7 +51,9 @@ public class MapsforgeMapView extends MapView implements MapViewImpl { @Override public void draw(Canvas canvas) { try { - if (getMapZoomLevel() >= 22) { // to avoid too close zoom level (mostly on Samsung Galaxy S series) + // Google Maps and OSM Maps use different zoom levels for the same view. + // Here we don't want the Google Maps compatible zoom level, but the actual one. + if (getActualMapZoomLevel() > 22) { // to avoid too close zoom level (mostly on Samsung Galaxy S series) getController().setZoom(22); } @@ -170,11 +172,27 @@ public class MapsforgeMapView extends MapView implements MapViewImpl { // Nothing to do here } + /** + * Get the map zoom level which is compatible with Google Maps. + * + * @return the current map zoom level +1 + */ @Override public int getMapZoomLevel() { + // Google Maps and OSM Maps use different zoom levels for the same view. + // All OSM Maps zoom levels are offset by 1 so they match Google Maps. return getMapPosition().getZoomLevel() + 1; } + /** + * Get the actual map zoom level + * + * @return the current map zoom level with no adjustments + */ + private int getActualMapZoomLevel() { + return getMapPosition().getZoomLevel(); + } + @Override public void setMapSource() { diff --git a/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapController.java b/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapController.java index 2160d21..573f65e 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapController.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapController.java @@ -26,13 +26,15 @@ public class MapsforgeMapController implements MapControllerImpl { mapController.setCenter((GeoPoint) geoPoint); } + /** + * Set the map zoom level to mapzoom-1 or maxZoomLevel, whichever is least + * mapzoom-1 is used to be compatible with Google Maps zoom levels + */ @Override public void setZoom(int mapzoom) { - int mfzoom = mapzoom - 1; - if (mfzoom > maxZoomLevel) { - mfzoom = maxZoomLevel; - } - mapController.setZoom(mfzoom); + // Google Maps and OSM Maps use different zoom levels for the same view. + // All OSM Maps zoom levels are offset by 1 so they match Google Maps. + mapController.setZoom(Math.min(mapzoom - 1, maxZoomLevel)); } @Override diff --git a/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java b/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java index 14eda37..e53d976 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java @@ -46,7 +46,9 @@ public class MapsforgeMapView024 extends MapView implements MapViewImpl { @Override public void draw(Canvas canvas) { try { - if (getMapZoomLevel() >= 22) { // to avoid too close zoom level (mostly on Samsung Galaxy S series) + // Google Maps and OSM Maps use different zoom levels for the same view. + // Here we don't want the Google Maps compatible zoom level, but the actual one. + if (getActualMapZoomLevel() > 22) { // to avoid too close zoom level (mostly on Samsung Galaxy S series) getController().setZoom(22); } @@ -165,11 +167,27 @@ public class MapsforgeMapView024 extends MapView implements MapViewImpl { // Nothing to do here } + /** + * Get the map zoom level which is compatible with Google Maps. + * + * @return the current map zoom level +1 + */ @Override public int getMapZoomLevel() { + // Google Maps and OSM Maps use different zoom levels for the same view. + // All OSM Maps zoom levels are offset by 1 so they match Google Maps. return getZoomLevel() + 1; } + /** + * Get the actual map zoom level + * + * @return the current map zoom level with no adjustments + */ + private int getActualMapZoomLevel() { + return getZoomLevel(); + } + @Override public void setMapSource() { setMapViewMode(MapViewMode.CANVAS_RENDERER); |
