假设我有一个谷歌地图视图,并在其上面有另一个视图,它覆盖了部分内容,隐藏了地图的一些内容。
我需要制作地图的“相机”,进行聚焦并在坐标上设置标记,然后让它们全部位于地图可见部分的中间。
这样的事情:
原始代码专注于(约)整个屏幕的中心,使标记几乎不可见(底部视图覆盖它)。
事实是,我找不到正确的方法来将正确的值设置为地图本身的Y坐标(即纬度)。
我试过,考虑到底部视图的高度,以及我放置标记的坐标,来计算delta(当然不会更改标记本身):
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());
可悲的是,这一点集中在标记之上。
我写的内容有什么问题?我该怎么做才能解决它?
答案 0 :(得分:7)
好的,我发现了一种解决方法,我觉得它适用于所有设备(在3上测试,每种设备都有不同的屏幕分辨率和大小):
我已经测量了标记本身有多少像素(然后转换为DP)一度的变化。
由此,我测量了每个视图的高度,并计算了移动相机所需的增量。
在我的情况下,就是这样(假设缩放是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());
它有效。
我想知道是否可以调整它以支持任何缩放值。
答案 1 :(得分:1)
您的代码几乎是正确的,但它超出了标记,因为您在计算bottomViewHeight
而非point.y
时考虑了bottomViewHeight/2
(当您的视图大小为200px,你只需要取代地图100px来重新定位它):
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()
时,地图都会移动。