Java Android谷歌地图:将scrollBy与zoomBy结合起来,实现同时平移和缩放;快速移动

Java Android谷歌地图:将scrollBy与zoomBy结合起来,实现同时平移和缩放;快速移动,java,android,google-maps,Java,Android,Google Maps,我想同时缩放和滚动GoogleMap对象。不幸的是,如果我只做了两个moveCamera调用(一个接一个),似乎只有第二个调用生效 另一种方法是传递一个CameraPosition,但不幸的是,CameraPosition构造函数似乎不接受一个处理滚动量的参数(它对缩放级别不变),而只接受一个关于lat/lon的参数 是否有一些巧妙的方法来组合/连接CameraUpdate对象,以便我只需发出一个moveCamera命令即可进行平移和缩放 我认为这样的事情是可能的,因为你可以在触摸地图的时候做。

我想同时缩放和滚动
GoogleMap
对象。不幸的是,如果我只做了两个
moveCamera
调用(一个接一个),似乎只有第二个调用生效

另一种方法是传递一个
CameraPosition
,但不幸的是,
CameraPosition
构造函数似乎不接受一个处理滚动量的参数(它对缩放级别不变),而只接受一个关于lat/lon的参数

是否有一些巧妙的方法来组合/连接
CameraUpdate
对象,以便我只需发出一个
moveCamera
命令即可进行平移和缩放


我认为这样的事情是可能的,因为你可以在触摸地图的时候做。放下两个手指,可以通过展开手指进行放大/缩小,同时移动两个手指进行平移。

看起来最好的选择是修改调用
GoogleMap.getCameraPosition()
时返回的
CameraPosition
对象。但是,您不能仅将
CameraPosition
对象的纬度和经度增加滚动的像素数。您必须获取
摄影机位置的LatLng坐标,使用
投影
类将其转换为
对象,修改
,然后将其转换回
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));

有一种方法
newLatLngZoom(LatLng LatLng,float zoom)
,它将缩放到位于LatLng的点。对于缩放到偏离中心的点P的情况,它可以通过一些数学运算完成

要反向思考这个问题,我们知道缩放后地图中心C的屏幕坐标,这样我们就知道了C的LatLng。这个LatLng需要传递到newLatLngZoom方法,这样它将以点为中心,p与之前相同(这就是我们定义的问题,缩放到p)。所以我们需要在缩放之前找到C的屏幕坐标

假设缩放前的缩放值为z1,缩放后的缩放值为
z1+dz
。谷歌地图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中。

Ooh,我喜欢这样。我会试一试,然后再打给你。谢谢你的主意!所以这真的很接近。也许我们能做到最好?但目前的问题是,缩放总是以地图中心为焦点进行缩放。在我的应用程序中,有一个移动的小光标,可以在X、Y和Z方向进行控制。如果我关闭缩放,这个解决方案对于滚动非常有效。但是,如果启用了“缩放”,则在尝试缩放地图边缘时效果不正确,因为它将向中心而不是光标位置缩放。再说一次,这可能是最好的,所以我可能会同意!我想我基本上需要带焦点的
zoom
功能来实现我想要的工作方式。。。但是,我认为这可能是最接近的解决方案?为什么不使用内置的缩放和滚动功能。你在其他地方处理地图的触摸事件吗?因为我试图同时缩放和滚动,所以我无法使用地图显示的滚动和缩放功能,因为它们相互“打架”。交互方法不是基于触摸的——我使用一个外部控件来移动地图,因此触摸控件正常工作的事实不适用于我。只是好奇,这与创建一个目标为
latLng
且缩放为
zoom
的摄影机位置有何不同,然后使用CameraUpdate Factory创建此位置的CameraUpdate/缩放?
CameraUpdateFactory.newLatLngZoom()
只是创建一个新的CameraPosition,然后再创建一个CameraPosition到该位置的CameraUpdate的一个快捷方式,或者还有其他方式吗?CameraUpdateFactory.newLatLngZoom()与创建一个CameraPosition然后执行CameraPosition相同。