moveCamera method
void
moveCamera(
- LatLng location,
- double? zoom
)
override
Implementation
@override
void moveCamera(latlong.LatLng location, double? zoom) async {
// First approach, simpler but less accurate
// final controller = await mapController.future;
// final visibleRegion = await controller.getVisibleRegion();
// // Calculate padding offset
// final paddingOffset = LatLng(
// (visibleRegion.northeast.latitude - visibleRegion.southwest.latitude) *
// (padding.top - padding.bottom) /
// viewportSize.height,
// (visibleRegion.northeast.longitude - visibleRegion.southwest.longitude) *
// (padding.left - padding.right) /
// viewportSize.width,
// );
// controller.animateCamera(
// CameraUpdate.newCameraPosition(
// CameraPosition(
// target: LatLng(
// location.latitude + paddingOffset.latitude,
// location.longitude + paddingOffset.longitude,
// ),
// zoom: zoom ?? 16,
// ),
// ),
// );
// Second approach, more complex but should be more accurate
// final c = await mapController.future;
// // Use current zoom if not provided
// final currentZoom = await c.getZoomLevel();
// final targetZoom = zoom ?? currentZoom;
// // Where the "center" of the padded viewport actually is (in screen px)
// final paddedCenterX =
// (viewportSize.width / 2) + (padding.left - padding.right) / 2;
// final paddedCenterY =
// (viewportSize.height / 2) + (padding.top - padding.bottom) / 2;
// // Find the lat/lng that appears at that padded center
// final targetScreen = ScreenCoordinate(
// x: paddedCenterX.round(),
// y: paddedCenterY.round(),
// );
// final latLngAtPaddedCenter = await c.getLatLng(targetScreen);
// // Compute the lat/lng shift needed so `location` ends up at the padded center
// final dx = location.latitude - latLngAtPaddedCenter.latitude;
// final dy = location.longitude - latLngAtPaddedCenter.longitude;
// await c.animateCamera(
// CameraUpdate.newCameraPosition(
// CameraPosition(
// target: LatLng(
// location.latitude +
// dx, // effectively centers location at padded center
// location.longitude + dy,
// ),
// zoom: targetZoom,
// ),
// ),
// );
// Third approach, simpler and should be accurate enough
final c = await mapController.future;
final currentZoom = await c.getZoomLevel();
await c.animateCamera(
CameraUpdate.newLatLngZoom(
location.toGoogleMapLatLng(), zoom ?? currentZoom),
);
}