Android谷歌地图:将scrollBy与zoomBy结合使用可同时实现平移和放大放大

时间:2014-02-20 15:26:32

标签: java android google-maps

我想同时缩放和滚动GoogleMap个对象。不幸的是,似乎我只是进行了两次moveCamera次呼叫(一个接一个),只有第二次呼叫才会生效。

另一种方法是传递一个CameraPosition,但不幸的是,CameraPosition构造函数看起来不会处理一个处理滚动量的参数(这对于缩放级别是不变的) ,但只是关于lat / lon要去的论据。

是否有一些聪明的方法可以组合/连接CameraUpdate个对象,这样我就可以发出一个同时执行平移和缩放的moveCamera命令?

我认为这样的事情是可能的,因为你可以在触摸地图时这样做。你放下两根手指,你可以通过伸展你的手指和平移来放大/缩小它们同时移动它们。

2 个答案:

答案 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中。