Skip to content

Commit 95db398

Browse files
committed
feat: [android] add a method animateCamera
1 parent b6a73c2 commit 95db398

3 files changed

Lines changed: 72 additions & 15 deletions

File tree

android/src/main/java/com/google/android/react/navsdk/MapViewController.java

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -808,24 +808,38 @@ public void moveCamera(Map<String, Object> map) {
808808
}
809809

810810
public void animateCamera(Map<String, Object> map) {
811-
if (mGoogleMap != null) {
812-
int zoom = CollectionUtil.getInt("zoom", map, 0);
813-
int tilt = CollectionUtil.getInt("tilt", map, 0);
814-
int bearing = CollectionUtil.getInt("bearing", map, 0);
815-
int animationDuration = CollectionUtil.getInt("duration", map, 0);
816-
817-
CameraPosition cameraPosition =
818-
new CameraPosition.Builder()
819-
.target(
820-
ObjectTranslationUtil.getLatLngFromMap(
821-
(Map<String, Object>) map.get("target"))) // Set the target location
822-
.zoom(zoom) // Set the desired zoom level
823-
.tilt(tilt) // Set the desired tilt angle (0 for straight down, 90 for straight up)
824-
.bearing(bearing) // Set the desired bearing (rotation angle in degrees)
825-
.build();
811+
if (mGoogleMap == null) {
812+
return;
813+
}
814+
815+
Object targetObj = map.get("target");
816+
if (targetObj == null) {
817+
return;
818+
}
826819

820+
LatLng latLng = ObjectTranslationUtil.getLatLngFromMap((Map<String, Object>) targetObj);
821+
if (latLng == null) {
822+
return;
823+
}
824+
825+
int zoom = CollectionUtil.getInt("zoom", map, 0);
826+
int tilt = CollectionUtil.getInt("tilt", map, 0);
827+
int bearing = CollectionUtil.getInt("bearing", map, 0);
828+
int animationDuration = CollectionUtil.getInt("duration", map, 0);
829+
830+
CameraPosition cameraPosition =
831+
new CameraPosition.Builder()
832+
.target(latLng)
833+
.zoom(zoom) // Set the desired zoom level
834+
.tilt(tilt) // Set the desired tilt angle (0 for straight down, 90 for straight up)
835+
.bearing(bearing) // Set the desired bearing (rotation angle in degrees)
836+
.build();
837+
838+
if (animationDuration > 0) {
827839
mGoogleMap.animateCamera(
828840
CameraUpdateFactory.newCameraPosition(cameraPosition), animationDuration, null);
841+
} else {
842+
mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
829843
}
830844
}
831845

android/src/main/java/com/google/android/react/navsdk/NavAutoModule.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,25 @@ public void moveCamera(ReadableMap cameraPosition, final Promise promise) {
612612
});
613613
}
614614

615+
@Override
616+
public void animateCamera(
617+
ReadableMap cameraPosition, @Nullable Double duration, final Promise promise) {
618+
UiThreadUtil.runOnUiThread(
619+
() -> {
620+
if (mMapViewController == null) {
621+
promise.reject(JsErrors.NO_MAP_ERROR_CODE, JsErrors.NO_MAP_ERROR_MESSAGE);
622+
return;
623+
}
624+
625+
Map<String, Object> map = cameraPosition.toHashMap();
626+
if (duration != null) {
627+
map.put("duration", duration.doubleValue());
628+
}
629+
mMapViewController.animateCamera(map);
630+
promise.resolve(null);
631+
});
632+
}
633+
615634
@Override
616635
public void isAutoScreenAvailable(final Promise promise) {
617636
promise.resolve(mMapViewController != null);

android/src/main/java/com/google/android/react/navsdk/NavViewModule.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
package com.google.android.react.navsdk;
1515

1616
import android.location.Location;
17+
import androidx.annotation.Nullable;
1718
import com.facebook.react.bridge.Arguments;
1819
import com.facebook.react.bridge.Promise;
1920
import com.facebook.react.bridge.ReactApplicationContext;
@@ -261,6 +262,29 @@ public void moveCamera(String nativeID, ReadableMap cameraPosition, final Promis
261262
});
262263
}
263264

265+
@Override
266+
public void animateCamera(
267+
String nativeID,
268+
ReadableMap cameraPosition,
269+
@Nullable Double duration,
270+
final Promise promise) {
271+
UiThreadUtil.runOnUiThread(
272+
() -> {
273+
IMapViewFragment fragment = mNavViewManager.getFragmentByNativeId(nativeID);
274+
if (fragment == null) {
275+
promise.reject(JsErrors.NO_MAP_ERROR_CODE, JsErrors.NO_MAP_ERROR_MESSAGE);
276+
return;
277+
}
278+
279+
Map<String, Object> map = cameraPosition.toHashMap();
280+
if (duration != null) {
281+
map.put("duration", duration.doubleValue());
282+
}
283+
fragment.getMapController().animateCamera(map);
284+
promise.resolve(null);
285+
});
286+
}
287+
264288
@Override
265289
public void showRouteOverview(String nativeID, final Promise promise) {
266290
UiThreadUtil.runOnUiThread(

0 commit comments

Comments
 (0)