如何把重点放在谷歌地图的位置,考虑一个视图是最重要的呢?

背景

假设我有一个谷歌地图视图,并在其上的另一个视图,涵盖了一部分,隐藏地图的一些内容。

问题

我需要制作地图上的“相机”,将其聚焦在坐标上,并在地图的可见部分中间放置一个标记。

像这样的东西:

在这里输入图像说明

原始代码重点关注整个屏幕的中心,使得标记几乎看不见(底视图覆盖它)。

事情是,我无法find适当的方法来设置正确的值到地图的Y坐标(即纬度)。

我试过了

我尝试了底视图的高度,以及我把标记放在哪个坐标上,以计算三angular洲(当然不会改变标记本身):

final float neededZoom = 6.5f; int bottomViewHeight = bottomView.getHeight(); LatLng posToFocusOn = ...; final Point point = mMap.getProjection().toScreenLocation(posToFocusOn); final float curZoom = mMap.getCameraPosition().zoom; point.y += bottomViewHeight * curZoom / neededZoom; posToFocusOn = mMap.getProjection().fromScreenLocation(point); final CameraUpdate cameraPosition = CameraUpdateFactory.newCameraPosition(new Builder().target(posToFocusOn).zoom(neededZoom).build()); 

可悲的是,这种方式集中在标记上方。

这个问题

我写的是什么问题? 我能做些什么来解决它?

Solutions Collecting From Web of "如何把重点放在谷歌地图的位置,考虑一个视图是最重要的呢?"

好的,我find了一种解决方法,我认为它适用于所有设备(3种testing,每种都有不同的屏幕分辨率和尺寸):

我已经测量了多less像素(然后转换为DP)标记本身有一度的变化。

由此,我测量了每个视图的高度,并计算了移动摄像机所需的三angular洲。

在我的情况下,这是这样的(假设缩放是6.5f):

  //measured as 223 pixels on Nexus 5, which has xxhdpi, so divide by 3 final float oneDegreeInPixels = convertDpToPixels( 223.0f / 3.0f); final float mapViewCenter = mapViewHeight / 2.0f; final float bottomViewHeight = ...; final float posToFocusInPixelsFromTop = (mapViewHeight - bottomViewHeight) / 2.0f ;// can optionally add the height of the view on the top area final float deltaLatDegreesToMove = (mapViewCenter - posToFocusInPixelsFromTop) / oneDegreeInPixels; LatLng posToFocusOn = new LatLng(latitude - deltaLatDegreesToMove, longitude); final CameraUpdate cameraPosition = CameraUpdateFactory.newCameraPosition(new Builder().target(posToFocusOn).zoom(neededZoom).build()); 

它的工作。

我想知道是否可以调整以支持任何缩放值。

你的代码几乎是正确的,但是它高于标记,因为在计算point.y而不是bottomViewHeight/2 (当你的视图的大小是200px时,你只需要移动地图100px来重新定位它)就考虑了bottomViewHeight

 point.y += (bottomViewHeight / 2) * curZoom / neededZoom; 

更新:

这是一个更通用的方法,它考虑到地图边界并根据bottomView的高度计算新的地图边界。 这是独立的缩放。

 public void recenter() { LatLngBounds mapBounds = mMap.getProjection().getVisibleRegion().latLngBounds; Point nothEastPoint = mMap.getProjection().toScreenLocation(mapBounds.northeast); Point souhWestPoint = mMap.getProjection().toScreenLocation(mapBounds.southwest); Point newNorthEast = new Point(nothEastPoint.x, nothEastPoint.y + bottomView.getHeight() / 2); Point newSouhWestPoint = new Point(souhWestPoint.x, souhWestPoint.y + bottomView.getHeight() / 2); LatLngBounds newBounds = LatLngBounds.builder() .include(mMap.getProjection().fromScreenLocation(newNorthEast)) .include(mMap.getProjection().fromScreenLocation(newSouhWestPoint)) .build(); mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(newBounds, 0)); } 

请注意,每次您调用recenter() ,地图都会移动。