diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index 8fa2d0b1525..3f8e53e90cc 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -508,7 +508,7 @@ public void onSurfaceTextureUpdated(SurfaceTexture surface) { if (destroyed) { return; } - mapboxMap.onUpdate(); + mapboxMap.onUpdateRegionChange(); } } @@ -969,8 +969,10 @@ public void run() { mapboxMap.onPostMapReady(); } }); + } else if (change == DID_FINISH_RENDERING_FRAME || change == DID_FINISH_RENDERING_FRAME_FULLY_RENDERED) { + mapboxMap.onUpdateFullyRendered(); } else if (change == REGION_IS_CHANGING || change == REGION_DID_CHANGE || change == DID_FINISH_LOADING_MAP) { - mapboxMap.onUpdate(); + mapboxMap.onUpdateRegionChange(); } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index 46c5e269c03..976c11d17ac 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -155,14 +155,18 @@ void onPostMapReady() { /** * Called when the user */ - void onUpdate() { - CameraPosition cameraPosition = transform.invalidateCameraPosition(); - uiSettings.update(cameraPosition); - // FIXME introduce update method with camera position + void onUpdateRegionChange() { trackingSettings.update(); annotationManager.update(); } + void onUpdateFullyRendered() { + CameraPosition cameraPosition = transform.invalidateCameraPosition(); + if (cameraPosition != null) { + uiSettings.update(cameraPosition); + } + } + // Style /** diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java index 7c68a48c4d1..e991819e4f5 100755 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java @@ -61,6 +61,8 @@ final class NativeMapView { // Listener invoked to return a bitmap of the map private MapboxMap.SnapshotReadyCallback snapshotReadyCallback; + private static final int CENTER_XY_VALUE = -1; + // // Static methods // @@ -382,14 +384,23 @@ public void setZoom(double zoom) { if (isDestroyedOn("setZoom")) { return; } - setZoom(zoom, 0); + setZoom(zoom, CENTER_XY_VALUE, CENTER_XY_VALUE, 0); } - public void setZoom(double zoom, long duration) { + public void setZoom(double zoom, double cx, double cy, long duration) { if (isDestroyedOn("setZoom")) { return; } - nativeSetZoom(zoom, duration); + + if (cx != CENTER_XY_VALUE) { + cx = cx / pixelRatio; + } + + if (cy != CENTER_XY_VALUE) { + cy = cy / pixelRatio; + } + + nativeSetZoom(zoom, cx, cy, duration); } public double getZoom() { @@ -1019,7 +1030,7 @@ private native void nativeInitialize(NativeMapView nativeMapView, FileSource fil private native double nativeGetScale(); - private native void nativeSetZoom(double zoom, long duration); + private native void nativeSetZoom(double zoom, double cx, double cy, long duration); private native double nativeGetZoom(); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java index 0f6b146907b..2a81ad6752a 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java @@ -182,13 +182,17 @@ void zoom(boolean zoomIn, float x, float y) { // Cancel any animation cancelTransitions(); - if (zoomIn) { - mapView.scaleBy(2.0, x, y, MapboxConstants.ANIMATION_DURATION); - } else { - mapView.scaleBy(0.5, x, y, MapboxConstants.ANIMATION_DURATION); + CameraPosition cameraPosition = invalidateCameraPosition(); + if (cameraPosition != null) { + zoom(cameraPosition, zoomIn, x, y); } } + private void zoom(@NonNull CameraPosition cameraPosition, boolean zoomIn, float x, float y) { + int newZoom = (int) Math.round(cameraPosition.zoom + (zoomIn ? 1 : -1)); + mapView.setZoom(newZoom, x, y, MapboxConstants.ANIMATION_DURATION); + } + void setZoom(double zoom) { mapView.setZoom(zoom); } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java index 6ec0ccc11f2..241a454d352 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/DebugModeActivity.java @@ -5,7 +5,9 @@ import android.support.design.widget.FloatingActionButton; import android.support.v7.app.AppCompatActivity; import android.view.View; +import android.widget.TextView; +import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.constants.Style; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; @@ -47,9 +49,21 @@ protected void onCreate(Bundle savedInstanceState) { @Override public void onMapReady(@NonNull MapboxMap map) { mapboxMap = map; + + mapboxMap.getUiSettings().setZoomControlsEnabled(true); + + // show current zoom level on screen + final TextView textView = (TextView) findViewById(R.id.textZoom); + mapboxMap.setOnCameraChangeListener(new MapboxMap.OnCameraChangeListener() { + @Override + public void onCameraChange(CameraPosition position) { + textView.setText(String.format(getString(R.string.debug_zoom), position.zoom)); + } + }); } }); + FloatingActionButton fabDebug = (FloatingActionButton) findViewById(R.id.fabDebug); fabDebug.setOnClickListener(new View.OnClickListener() { @Override diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_debug_mode.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_debug_mode.xml index ffbf2e30a18..6db8b073d9c 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_debug_mode.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_debug_mode.xml @@ -10,7 +10,18 @@ + android:layout_height="match_parent" + app:mapbox_uiAttribution="false" + app:mapbox_uiCompass="false" + app:mapbox_uiLogo="false"/> + + Stamford Bridge Arsenal Emirates Stadium + Zoom: %s diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index c97bdbbfe34..d49f4f2a597 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -394,8 +394,8 @@ jni::jdouble NativeMapView::getScale(jni::JNIEnv&) { return map->getScale(); } -void NativeMapView::setZoom(jni::JNIEnv&, jni::jdouble zoom, jni::jlong duration) { - map->setZoom(zoom, mbgl::AnimationOptions{mbgl::Milliseconds(duration)}); +void NativeMapView::setZoom(jni::JNIEnv&, jni::jdouble zoom, jni::jdouble x, jni::jdouble y, jni::jlong duration) { + map->setZoom(zoom, mbgl::ScreenCoordinate{x,y}, mbgl::AnimationOptions{mbgl::Milliseconds(duration)}); } jni::jdouble NativeMapView::getZoom(jni::JNIEnv&) { diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp index b7bf03402ed..4afea036bff 100755 --- a/platform/android/src/native_map_view.hpp +++ b/platform/android/src/native_map_view.hpp @@ -115,7 +115,7 @@ class NativeMapView : public View, public Backend { jni::jdouble getScale(jni::JNIEnv&); - void setZoom(jni::JNIEnv&, jni::jdouble, jni::jlong); + void setZoom(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jdouble, jni::jlong); jni::jdouble getZoom(jni::JNIEnv&);