diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/CameraStop.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/CameraStop.kt index 144053411..bea5d40e2 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/CameraStop.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/CameraStop.kt @@ -95,12 +95,10 @@ class CameraStop { fun toCameraUpdate(mapView: RNMBXMapView): CameraUpdateItem { val map = mapView.getMapboxMap() val currentCamera = map.cameraState + val builder = CameraOptions.Builder() builder.center(currentCamera.center) builder.bearing(currentCamera.bearing) - - val currentPadding = currentCamera.padding - builder.padding(currentCamera.padding) builder.zoom(currentCamera.zoom) if (mBearing != null) { @@ -109,7 +107,11 @@ class CameraStop { if (mTilt != null) { builder.pitch(mTilt) } + if (mZoom != null) { + builder.zoom(mZoom) + } + val currentPadding = currentCamera.padding val paddingLeft: Int = mPaddingLeft ?: currentPadding.left.toInt() val paddingTop: Int = mPaddingTop ?: currentPadding.top.toInt() val paddingRight: Int = mPaddingRight ?: currentPadding.right.toInt() @@ -117,10 +119,10 @@ class CameraStop { val cameraPadding = intArrayOf(paddingLeft, paddingTop, paddingRight, paddingBottom) val cameraPaddingClipped = clippedPadding(cameraPadding, mapView) val cameraPaddingEdgeInsets = convert(cameraPaddingClipped) + builder.padding(cameraPaddingEdgeInsets) if (mLatLng != null) { builder.center(mLatLng!!.point) - builder.padding(cameraPaddingEdgeInsets) } else if (mBounds != null) { val tilt = if (mTilt != null) mTilt!! else currentCamera.pitch val bearing = if (mBearing != null) mBearing!! else currentCamera.bearing @@ -131,17 +133,14 @@ class CameraStop { bearing, tilt ) - builder.center(boundsCamera.center) builder.anchor(boundsCamera.anchor) builder.zoom(boundsCamera.zoom) + builder.bearing(boundsCamera.bearing) + builder.pitch(boundsCamera.pitch) builder.padding(boundsCamera.padding) } - if (mZoom != null) { - builder.zoom(mZoom) - } - return CameraUpdateItem(map, builder.build(), mDuration, mCallback, mMode) } @@ -195,6 +194,7 @@ class CameraStop { when (readableMap.getInt("mode")) { CameraMode.FLIGHT -> stop.setMode(CameraMode.FLIGHT) CameraMode.LINEAR -> stop.setMode(CameraMode.LINEAR) + CameraMode.MOVE -> stop.setMode(CameraMode.MOVE) CameraMode.NONE -> stop.setMode(CameraMode.NONE) else -> stop.setMode(CameraMode.EASE) } diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/CameraUpdateItem.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/CameraUpdateItem.kt index e4cc378e4..6b18caa34 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/CameraUpdateItem.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/CameraUpdateItem.kt @@ -83,7 +83,7 @@ class CameraUpdateItem( val animationOptions = MapAnimationOptions.Builder(); // animateCamera / easeCamera only allows positive duration - if (duration == 0 || mCameraMode == CameraMode.NONE) { + if (duration == 0 || mCameraMode == CameraMode.MOVE || mCameraMode == CameraMode.NONE) { map.flyToV11(mCameraUpdate, animationOptions.apply { duration(0) }, @@ -109,7 +109,6 @@ class CameraUpdateItem( callback ) } - null } override fun cancel(mayInterruptIfRunning: Boolean): Boolean { diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCamera.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCamera.kt index aaae75f24..bf149f9b1 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCamera.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCamera.kt @@ -179,15 +179,12 @@ class RNMBXCamera(private val mContext: Context, private val mManager: RNMBXCame private fun updateMaxBounds() { withMapView { mapView -> val map = mapView.getMapboxMap() - val maxBounds = mMaxBounds val builder = CameraBoundsOptions.Builder() - - if (maxBounds != null) { - builder.bounds(maxBounds.toBounds()) - } - mMinZoomLevel?.let { builder.minZoom(it) } - mMaxZoomLevel?.let { builder.maxZoom(it) } + builder.bounds(mMaxBounds?.toBounds()) + builder.minZoom(mMinZoomLevel ?: 0.0) // Passing null does not reset this value. + builder.maxZoom(mMaxZoomLevel ?: 25.0) // Passing null does not reset this value. map.setBounds(builder.build()) + mCameraStop?.let { updateCamera(it) } } } diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCameraManager.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCameraManager.kt index 305c5cef4..09728867e 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCameraManager.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/RNMBXCameraManager.kt @@ -59,12 +59,12 @@ class RNMBXCameraManager(private val mContext: ReactApplicationContext, val view @ReactProp(name = "minZoomLevel") override fun setMinZoomLevel(camera: RNMBXCamera, value: Dynamic) { - camera.setMinZoomLevel(value.asDouble()) + camera.setMinZoomLevel(value.asDoubleOrNull()) } @ReactProp(name = "maxZoomLevel") override fun setMaxZoomLevel(camera: RNMBXCamera, value: Dynamic) { - camera.setMaxZoomLevel(value.asDouble()) + camera.setMaxZoomLevel(value.asDoubleOrNull()) } @ReactProp(name = "followUserLocation") diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/constants/CameraMode.java b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/constants/CameraMode.java index b0d78727e..19039d93e 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/camera/constants/CameraMode.java +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/camera/constants/CameraMode.java @@ -7,12 +7,13 @@ public class CameraMode { - @IntDef({ FLIGHT, EASE, LINEAR, NONE }) + @IntDef({ FLIGHT, EASE, LINEAR, MOVE, NONE }) @Retention(RetentionPolicy.SOURCE) public @interface Mode {} public static final int FLIGHT = 1; public static final int EASE = 2; public static final int LINEAR = 3; - public static final int NONE = 4; + public static final int MOVE = 4; + public static final int NONE = 5; } diff --git a/android/src/main/java/com/rnmapbox/rnmbx/modules/RNMBXModule.kt b/android/src/main/java/com/rnmapbox/rnmbx/modules/RNMBXModule.kt index 8f74eb01d..55e4f7b02 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/modules/RNMBXModule.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/modules/RNMBXModule.kt @@ -90,6 +90,7 @@ class RNMBXModule(private val mReactContext: ReactApplicationContext) : ReactCon cameraModes["Flight"] = CameraMode.FLIGHT cameraModes["Ease"] = CameraMode.EASE cameraModes["Linear"] = CameraMode.LINEAR + cameraModes["Move"] = CameraMode.MOVE cameraModes["None"] = CameraMode.NONE // offline region download states diff --git a/example/src/examples/V10/CameraAnimation.tsx b/example/src/examples/V10/CameraAnimation.tsx index faafa9a67..428b40040 100644 --- a/example/src/examples/V10/CameraAnimation.tsx +++ b/example/src/examples/V10/CameraAnimation.tsx @@ -50,6 +50,7 @@ const CameraAnimation = () => { const [paddingRight, setPaddingRight] = useState(0); const [paddingTop, setPaddingTop] = useState(0); const [paddingBottom, setPaddingBottom] = useState(0); + const [zoom, setZoom] = useState(10); const [minZoom, setMinZoom] = useState(undefined); const [maxZoom, setMaxZoom] = useState(undefined); @@ -153,6 +154,34 @@ const CameraAnimation = () => { [easing], ); + const zoomCounter = useMemo(() => { + const disabled = coordinates.length > 1; + + return ( + + + + {zoom} + + + { + setZoom(Math.round(_value)); + }} + /> + + ); + }, [coordinates.length, zoom]); + const paddingCounter = useCallback( (value: number, setValue: (value: number) => void, label: string) => { return ( @@ -162,11 +191,7 @@ const CameraAnimation = () => { {`${Math.round(value)}`} { {label} - {`${ - value ?? 'Not set' - }`} + + {`${value ?? 'Not set'}`} + { { + Zoom + + {zoomCounter} + + + + Padding {paddingCounter(paddingTop, setPaddingTop, 'Top')} @@ -309,6 +337,11 @@ const styles = StyleSheet.create({ divider: { marginVertical: 8, }, + thumb: { + backgroundColor: 'black', + width: 15, + height: 15, + }, }); export default CameraAnimation;