[android] #3753 - Optimising zoom

[android] #3753 - removed old zoom methods from MapView
This commit is contained in:
Tobrun
2016-02-01 14:39:22 +01:00
parent 7c58c7803e
commit 6ebb3e88d8
5 changed files with 309 additions and 127 deletions

View File

@@ -93,7 +93,7 @@ public class CameraUpdateFactory {
* @return
*/
public static CameraUpdate zoomBy(float amount, Point focus) {
return new ZoomUpdate(ZoomUpdate.ZOOM_TO_POINT, focus.x, focus.y);
return new ZoomUpdate(amount, focus.x, focus.y);
}
/**

View File

@@ -611,7 +611,7 @@ public class MapView extends FrameLayout {
void setDirection(@FloatRange(from = MapboxConstants.MINIMUM_DIRECTION, to = MapboxConstants.MAXIMUM_DIRECTION) double direction, boolean animated) {
long duration = animated ? MapboxConstants.ANIMATION_DURATION : 0;
mNativeMapView.cancelTransitions();
// Out of range direactions are normallised in setBearing
// Out of range directions are normalised in setBearing
mNativeMapView.setBearing(-direction, duration);
}
@@ -639,105 +639,6 @@ public class MapView extends FrameLayout {
return mNativeMapView.getZoom();
}
/**
* <p>
* Zooms the map to a new zoom level immediately without changing the center coordinate.
* </p>
* <p>
* At zoom level 0, tiles cover the entire world map;
* at zoom level 1, tiles cover 1/14 of the world;
* at zoom level 2, tiles cover 1/16 of the world, and so on.
* </p>
* <p>
* The initial zoom level is 0. The maximum zoom level is {@link MapboxConstants#MAXIMUM_ZOOM}.
* </p>
* If you want to animate the change, use {@link MapView#setZoom(double, boolean)}.
*
* @param zoomLevel The new zoom.
* @see MapView#setZoom(double, boolean)
* @see MapboxConstants#MAXIMUM_ZOOM
*/
@UiThread
void setZoom(@FloatRange(from = MapboxConstants.MINIMUM_ZOOM, to = MapboxConstants.MAXIMUM_ZOOM) double zoomLevel) {
setZoom(zoomLevel, false);
}
/**
* <p>
* Zooms the map to a new zoom level and optionally animates the change without changing the center coordinate.
* </p>
* <p>
* At zoom level 0, tiles cover the entire world map;
* at zoom level 1, tiles cover 1/14 of the world;
* at zoom level 2, tiles cover 1/16 of the world, and so on.
* </p>
* The initial zoom level is 0. The maximum zoom level is {@link MapboxConstants#MAXIMUM_ZOOM}.
*
* @param zoomLevel The new zoom level.
* @param animated If true, animates the change. If false, immediately changes the map.
* @see MapboxConstants#MAXIMUM_ZOOM
*/
@UiThread
void setZoom(@FloatRange(from = MapboxConstants.MINIMUM_ZOOM, to = MapboxConstants.MAXIMUM_ZOOM) double zoomLevel, boolean animated) {
long duration = animated ? MapboxConstants.ANIMATION_DURATION : 0;
setZoom(zoomLevel, duration);
}
/**
* <p>
* Zooms the map to a new zoom level and optionally animates the change without changing the center coordinate.
* </p>
* <p>
* At zoom level 0, tiles cover the entire world map;
* at zoom level 1, tiles cover 1/14 of the world;
* at zoom level 2, tiles cover 1/16 of the world, and so on.
* </p>
* The initial zoom level is 0. The maximum zoom level is {@link MapboxConstants#MAXIMUM_ZOOM}.
*
* @param zoomLevel The new zoom level.
* @param duration The length of the animation.
* @see MapboxConstants#MAXIMUM_ZOOM
*/
@UiThread
void setZoom(@FloatRange(from = MapboxConstants.MINIMUM_ZOOM, to = MapboxConstants.MAXIMUM_ZOOM) double zoomLevel, long duration) {
if ((zoomLevel < MapboxConstants.MINIMUM_ZOOM) || (zoomLevel > MapboxConstants.MAXIMUM_ZOOM)) {
Log.w(TAG, "Not setting zoom, value is in a unsupported range: " + zoomLevel);
return;
}
mNativeMapView.cancelTransitions();
mNativeMapView.setZoom(zoomLevel, duration);
}
void setZoom(@FloatRange(from = MapboxConstants.MINIMUM_ZOOM, to = MapboxConstants.MAXIMUM_ZOOM) double zoomLevel, float x, float y) {
if ((zoomLevel < MapboxConstants.MINIMUM_ZOOM) || (zoomLevel > MapboxConstants.MAXIMUM_ZOOM)) {
Log.w(TAG, "Not setting zoom, value is in a unsupported range: " + zoomLevel);
return;
}
LatLng target = fromScreenLocation(new PointF(x, y));
flyTo(-1, target, MapboxConstants.ANIMATION_DURATION, -1, zoomLevel, null);
}
void setZoom(CameraUpdateFactory.ZoomUpdate update, long duration) {
switch (update.getType()) {
case CameraUpdateFactory.ZoomUpdate.ZOOM_IN:
setZoom(getZoom() + 1, duration);
break;
case CameraUpdateFactory.ZoomUpdate.ZOOM_OUT:
setZoom(getZoom() - 1, duration);
break;
case CameraUpdateFactory.ZoomUpdate.ZOOM_TO:
setZoom(update.getZoom(), duration);
break;
case CameraUpdateFactory.ZoomUpdate.ZOOM_BY:
setZoom(getZoom() + update.getZoom(), duration);
break;
case CameraUpdateFactory.ZoomUpdate.ZOOM_TO_POINT:
setZoom(update.getZoom(), update.getX(), update.getY());
break;
}
}
// /**
// * Return The current content padding left of the map view viewport.
// *

View File

@@ -115,14 +115,52 @@ public class MapboxMap {
*/
@UiThread
public final void moveCamera(CameraUpdate update) {
CameraPosition cameraPosition;
if (update instanceof CameraUpdateFactory.PositionCameraUpdate) {
CameraUpdateFactory.PositionCameraUpdate positionCameraUpdate = (CameraUpdateFactory.PositionCameraUpdate) update;
CameraPosition cameraPosition = new CameraPosition.Builder(positionCameraUpdate).build();
updateCameraPosition(cameraPosition);
mMapView.jumpTo(cameraPosition.bearing, cameraPosition.target, cameraPosition.tilt, cameraPosition.zoom);
}else if (update instanceof CameraUpdateFactory.ZoomUpdate) {
mMapView.setZoom((CameraUpdateFactory.ZoomUpdate) update, 0);
cameraPosition = new CameraPosition.Builder(positionCameraUpdate).build();
} else if (update instanceof CameraUpdateFactory.ZoomUpdate) {
CameraUpdateFactory.ZoomUpdate zoomUpdate = (CameraUpdateFactory.ZoomUpdate) update;
if(zoomUpdate.getType()!= CameraUpdateFactory.ZoomUpdate.ZOOM_TO_POINT){
cameraPosition = new CameraPosition.Builder(mCurrentCameraPosition)
.zoom(getZoom(zoomUpdate, mCurrentCameraPosition.zoom))
.build();
}else{
cameraPosition = new CameraPosition.Builder(mCurrentCameraPosition)
.zoom(getZoom(zoomUpdate, mCurrentCameraPosition.zoom))
.target(fromScreenLocation(new PointF(zoomUpdate.getX(),zoomUpdate.getY())))
.build();
}
} else {
Log.e(MapboxConstants.TAG, "Unsupported CameraUpdate");
return;
}
mCurrentCameraPosition = cameraPosition;
mMapView.jumpTo(cameraPosition.bearing, cameraPosition.target, cameraPosition.tilt, cameraPosition.zoom);
}
private float getZoom(CameraUpdateFactory.ZoomUpdate update, float currentZoom) {
switch (update.getType()) {
case CameraUpdateFactory.ZoomUpdate.ZOOM_IN:
currentZoom++;
break;
case CameraUpdateFactory.ZoomUpdate.ZOOM_OUT:
currentZoom--;
if (currentZoom < 0) {
currentZoom = 0;
}
break;
case CameraUpdateFactory.ZoomUpdate.ZOOM_TO:
currentZoom = update.getZoom();
break;
case CameraUpdateFactory.ZoomUpdate.ZOOM_BY:
currentZoom = currentZoom + update.getZoom();
break;
case CameraUpdateFactory.ZoomUpdate.ZOOM_TO_POINT:
currentZoom = currentZoom + update.getZoom();
break;
}
return currentZoom;
}
/**
@@ -147,14 +185,28 @@ public class MapboxMap {
*/
@UiThread
public final void easeCamera(CameraUpdate update, int durationMs, final MapboxMap.CancelableCallback callback) {
CameraPosition cameraPosition;
if (update instanceof CameraUpdateFactory.PositionCameraUpdate) {
CameraUpdateFactory.PositionCameraUpdate positionCameraUpdate = (CameraUpdateFactory.PositionCameraUpdate) update;
CameraPosition cameraPosition = new CameraPosition.Builder(positionCameraUpdate).build();
updateCameraPosition(cameraPosition);
mMapView.easeTo(cameraPosition.bearing, cameraPosition.target, getDurationNano(durationMs), cameraPosition.tilt, cameraPosition.zoom, callback);
}else if (update instanceof CameraUpdateFactory.ZoomUpdate) {
mMapView.setZoom((CameraUpdateFactory.ZoomUpdate) update, durationMs);
cameraPosition = new CameraPosition.Builder(positionCameraUpdate).build();
} else if (update instanceof CameraUpdateFactory.ZoomUpdate) {
CameraUpdateFactory.ZoomUpdate zoomUpdate = (CameraUpdateFactory.ZoomUpdate) update;
if(zoomUpdate.getType()!= CameraUpdateFactory.ZoomUpdate.ZOOM_TO_POINT){
cameraPosition = new CameraPosition.Builder(mCurrentCameraPosition)
.zoom(getZoom(zoomUpdate, mCurrentCameraPosition.zoom))
.build();
}else{
cameraPosition = new CameraPosition.Builder(mCurrentCameraPosition)
.zoom(getZoom(zoomUpdate, mCurrentCameraPosition.zoom))
.target(fromScreenLocation(new PointF(zoomUpdate.getX(),zoomUpdate.getY())))
.build();
}
} else {
Log.e(MapboxConstants.TAG, "Unsupported CameraUpdate");
return;
}
mCurrentCameraPosition = cameraPosition;
mMapView.easeTo(cameraPosition.bearing, cameraPosition.target, getDurationNano(durationMs), cameraPosition.tilt, cameraPosition.zoom, callback);
}
/**
@@ -205,19 +257,28 @@ public class MapboxMap {
*/
@UiThread
public final void animateCamera(CameraUpdate update, int durationMs, final MapboxMap.CancelableCallback callback) {
CameraPosition cameraPosition;
if (update instanceof CameraUpdateFactory.PositionCameraUpdate) {
CameraUpdateFactory.PositionCameraUpdate positionCameraUpdate = (CameraUpdateFactory.PositionCameraUpdate) update;
CameraPosition cameraPosition = new CameraPosition.Builder(positionCameraUpdate).build();
updateCameraPosition(cameraPosition);
mMapView.flyTo(cameraPosition.bearing, cameraPosition.target, getDurationNano(durationMs), cameraPosition.tilt, cameraPosition.zoom, callback);
cameraPosition = new CameraPosition.Builder(positionCameraUpdate).build();
} else if (update instanceof CameraUpdateFactory.ZoomUpdate) {
mMapView.setZoom((CameraUpdateFactory.ZoomUpdate) update, durationMs);
CameraUpdateFactory.ZoomUpdate zoomUpdate = (CameraUpdateFactory.ZoomUpdate) update;
if(zoomUpdate.getType()!= CameraUpdateFactory.ZoomUpdate.ZOOM_TO_POINT){
cameraPosition = new CameraPosition.Builder(mCurrentCameraPosition)
.zoom(getZoom(zoomUpdate, mCurrentCameraPosition.zoom))
.build();
}else {
cameraPosition = new CameraPosition.Builder(mCurrentCameraPosition)
.zoom(getZoom(zoomUpdate, mCurrentCameraPosition.zoom))
.target(fromScreenLocation(new PointF(zoomUpdate.getX(), zoomUpdate.getY())))
.build();
}
} else {
Log.e(MapboxConstants.TAG, "Unsupported CameraUpdate");
return;
}
}
// internal setter for CameraPosition
void updateCameraPosition(@NonNull CameraPosition cameraPosition) {
mCurrentCameraPosition = cameraPosition;
mMapView.flyTo(cameraPosition.bearing, cameraPosition.target, getDurationNano(durationMs), cameraPosition.tilt, cameraPosition.zoom, callback);
}
// internal time layer conversion