当前位置: 首页 > 知识库问答 >
问题:

棘手的Android谷歌地图缩放,同时保持中心点

景令秋
2023-03-14

解释我的问题并不容易,但我会努力的。

我有一个android GoogleMap,在它的顶部,我有一个ImageView始终位于它的中心。如果我拖动/平移地图,图钉将始终位于GoogleMap的中心。

现在,我在地图上的某个地方添加了一个标记。我想缩放以使中心点保持在地图的中心,并且标记在地图中可见,并且达到最高缩放级别。

问题是,如果我只是检查标记是否在地图的边界内,然后继续放大/缩小直到它,这个过程将始终重复,即尝试放大,如果标记在外面,然后缩小。

问题是我依赖于OnCameraChange侦听器,每当我放大或缩小时,它都会不断调用自己,因此,放大/缩小的过程将无限期地发生

journeyGoogleMap.setOnCameraChangeListener(new OnCameraChangeListener()
{
   @Override
   public void onCameraChange(final CameraPosition position)
   {

基本上,我需要的是一个函数,其中我可以提供中心LatLng和markerLatLng,它会自动计算LatLngBounds,确保我的中心位于LatLng边界的中心,然后我可以简单地使用

public static CameraUpdate newLatLngBounds (LatLngBounds bounds, int width, int height, int padding)

如下面的链接所示https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/CameraUpdateFactory#newLatLngBounds(com.google.android.gms.maps.model.LatLngBounds,int,int,int)

如果你还需要澄清,请告诉我

共有2个答案

柯唯
2023-03-14

使用googleMap.get投影(). getVisibleArea()获取屏幕的所有四个角作为形成梯形的LatLng值。计算梯形与通过中心和标记绘制的线相交的位置。比例因子是(中心到标记的距离/中心到交叉点的距离)。现在只需使用此比例因子相对于中心缩放梯形。这是新的可见区域。

您还可以使用getVisibleRegion()。使用latLngBounds简化计算,但请注意,返回矩形的某些区域实际上不可见。

茅炯
2023-03-14

您需要从两点计算LatLngBounds

  1. 您的标记位置和
  2. 放在当前中心的另一侧

第二个计算如下:

LatLng other = new LatLng(2 * center.latitude - position.latitude, 2 * center.longitude - position.longitude);

参见LatLngBoundsUtils。一般解决方案的fromcenter和positions。

 类似资料:
  • 我正在使用Android API的GoogleMaps和一个自定义的TileProvider,它使用URL获取缩放/x/y格式的平铺,以显示自定义的世界地图。 这里没什么特别的。该应用程序用于使用开放式街道地图。我注意到,在一定的缩放级别上,它会显示更详细的图像。 与谷歌地图相比,OSM的zoomlevel似乎有所不同。这会导致OSM的URL中出现更高的缩放值,而GoogleMaps会将更低的值放

  • 我使用的是谷歌地图API v3。我在地图上添加了一些带有信息的标记。双击(缩放)后,将选择my infowindow的内容。它不是那么友好的用户... null 你知道如何避免在信息中选择文本吗?谢了。

  • 我有一个网页上的现有地图,使用以下脚本段正确缩放和居中:var mapOptions={center:{lat: 43.57023,lng:-79.48676},缩放: 12}map=newgoogle.maps.Map(document.getElementById(地图画布), mapOptions); 然后,我使用以下命令添加kml层:var myLayer=new google.maps.

  • 所以我看到了一个特殊的例外,我敢肯定的是谷歌地图的绘图代码。 我有一个片段,在那里我以编程方式添加了一个支持地图片段,然后我在其中操纵谷歌地图实例。 这是stacktrace: 我无法可靠地复制它(尽管这种情况经常发生),我已经查看了ReadWriteDirectByteBuffer和ShortToByteBufferAdapter,但没有任何东西突然出现在我面前。 有什么想法吗?

  • 我有问题加载一个谷歌地图在我的片段。一切都从一个循环器视图适配器开始,该适配器启动活动“ViatGedetAllViewActivity”: 这是我的DetallViewActivity: =2 03-24 02:55:53.881 639-7362/com.example.usuari.MyApplication3 w/ResourcesManager:GetTopleVelResources: