Android Google Maps: Combine scrollBy with zoomBy for simultaneous pan & zoom
android, google-maps, java
Solution
It looks like your best option will be to modify the `CameraPosition` object returned when you call `GoogleMap.getCameraPosition()`. However, you won't be able to just increment that latitude and longitude of the `CameraPosition` object by the number of pixels you scrolled. You'll have to get the `CameraPosition`'s LatLng coordinates, convert that to a `Point` object using the `Projection` class, modify the `Point`, and then convert it back into a `LatLng` object.
For example:
GoogleMap map; // This is your GoogleMap object
int dx; // X distance scrolled
int dy; // Y distance scrolled
float dz; // Change in zoom level
float originalZoom;
CameraPosition position = map.getCameraPosition();
Project projection = map.getProjection();
LatLng mapTarget = position.target;
originalZoom = position.zoom;
Point mapPoint = projection.toScreenLocation(mapTarget);
mapPoint.x += dx;
mapPoint.y += dy;
mapTarget = projection.fromScreenLocation(mapPoint);
CameraPosition newPosition = new CameraPosition(position)
.target(mapTarget)
.zoom(originalZoom+dz)
.build();
map.moveCamera(CameraUpdateFactory.newCameraPosition(newPosition));
Problem
I'd like to both zoom and scroll a `GoogleMap` object at the same time. Unfortunately, it seems like if I just make two `moveCamera` calls (one after another), only the second call appears to take effect. An alternative approach would be to pass a `CameraPosition`, but unfortunately it looks like the `CameraPosition` constructor does not take an argument that deals with an amount to scroll (which is invariant to the zoom level), but only an argument as to what lat/lon to go to. Is there some clever way to combine/concatenate `CameraUpdate` objects so I can just issue one `moveCamera` command that does both a pan and a zoom? I assume something like this is possible because you can do it when you're touching the map. You put down two fingers, and you can zoom in/out by spreading your fingers and pan by moving them both simultaneously.