Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Google Maps: Combine scrollBy with zoomBy for simultaneous pan & zoom

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.

like image 555
aardvarkk Avatar asked Feb 20 '14 15:02

aardvarkk


1 Answers

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));
like image 170
ertemplin Avatar answered Sep 27 '22 19:09

ertemplin