我想同时缩放和滚动GoogleMap
个对象。不幸的是,似乎我只是进行了两次moveCamera
次呼叫(一个接一个),只有第二次呼叫才会生效。
另一种方法是传递一个CameraPosition
,但不幸的是,CameraPosition
构造函数看起来不会处理一个处理滚动量的参数(这对于缩放级别是不变的) ,但只是关于lat / lon要去的论据。
是否有一些聪明的方法可以组合/连接CameraUpdate
个对象,这样我就可以发出一个同时执行平移和缩放的moveCamera
命令?
我认为这样的事情是可能的,因为你可以在触摸地图时这样做。你放下两根手指,你可以通过伸展你的手指和平移来放大/缩小它们同时移动它们。
答案 0 :(得分:4)
看起来您最好的选择是修改致电CameraPosition
时返回的GoogleMap.getCameraPosition()
对象。但是,您无法仅按照滚动的像素数增加CameraPosition
对象的纬度和经度。您必须获取CameraPosition
的LatLng坐标,使用Point
类将其转换为Projection
对象,修改Point
,然后将其转换回一个LatLng
对象。
例如:
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));
答案 1 :(得分:1)
有这种方法newLatLngZoom (LatLng latLng, float zoom)
,它将缩放到位于latLng的点。对于缩放到偏离中心的点P的情况,它可以通过一些数学运算来实现。
为了扭转对问题的思考,我们知道缩放后地图中心C的屏幕坐标,以便我们知道C的LatLng。这个LatLng需要传递给newLatLngZoom方法,以便它将居中于point和P与之前相同(就像我们定义问题一样,缩放到P)。所以我们需要在缩放之前找到C的屏幕坐标。
假设缩放前的缩放值为z1,缩放后的变焦值为z1 + dz
。 Google地图API指出,在缩放级别N,世界的宽度约为256 * 2 ^ N dp。因此,之前世界的宽度为256*2^z1
,之后为256*2^(z1 + dz)
。
我们也知道在缩放之前和之后,P与C的距离与整个世界的比率没有变化。缩放后的C坐标只是地图视图的中心,这是已知的。让我们假设缩放前C的坐标为(Cx,Cy),那么我们可以得到(Px - Cx) / 256*2^z1 = (Px - C'x) / 256*2^(z1 + dz)
和(Py - Cy) / 256*2^z1 = (Py - C'y) / 256*2^(z1 + dz)
的等式。我忽略了宽高比以将宽度传递到高度,因为在求解方程时它将被取消。
求解Cx和Cy的等式,并将该值用作newLatLngZoom中的参数。如果你想添加平移并且你知道需要平移的dx dy值,那么只需在缩放后计算地图中的dx'dy'并将其添加到C中。