对于 p.1,最简单的方法是使用附加GroundOverlay
的纯色位图,由地面覆盖的背景颜色填充。正是您的示例图片可能是这样的(overlay_background.png
):
您应该将那张图片用作GroundOverlay
放置在“地板”下的“背景” GroundOverlay
。
为确保“背景”GroundOverlay
覆盖整个可见区域,您应该在“地板”覆盖层上稍微缩放该图像。您可以通过.positionFromBounds()
. 为了获得远离你的GroundOverlayOptions
“背景”覆盖范围,你可以使用这样的方法:radius
center
public LatLngBounds createBounds(LatLng center, float radius) {
LatLngBounds bounds = null;
if (center != null) {
bounds = new LatLngBounds.Builder()
.include(SphericalUtil.computeOffset(center, radius * Math.sqrt(2), 45))
.include(SphericalUtil.computeOffset(center, radius * Math.sqrt(2), 225))
.build();
}
return bounds;
}
哪里SphericalUtil
是Maps SDK for Android Utility Library的一部分。如何为这里描述的项目添加它。
同样通过setLatLngBoundsForCameraTarget()
方法,您可以将相机视图范围设置为略小于“背景”覆盖区域,以避免用户滚动地图超出“背景”覆盖范围时的情况。您还需要设置最小和最大缩放级别(通过setMinZoomPreference()
和setMaxZoomPreference()
)。
所以总体思路如下图所示:
为了将“背景”放置GroundOverlay
在“地板”下,GroundOverlay
您可以使用or的.setZIndex()
方法并将“背景”的Z-Index 设置为小于“地板”的 Z-Index,例如“背景”和地板覆盖(默认值 Z-索引是)。GroundOverlayOptions
GroundOverlay
GroundOverlay
GroundOverlay
Z-Index = 1
Z-Index = 2
0
所以使用这样的源代码:
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
// calculate borders for "background" overlay
LatLngBounds borders = createBounds(OVERLAY_CENTER, 1000);
// constrain the camera target to slightly less bounds.
LatLngBounds cameraBorders = createBounds(OVERLAY_CENTER, 500);
mGoogleMap.setLatLngBoundsForCameraTarget(borders);
mGoogleMap.setMinZoomPreference(18.0f);
mGoogleMap.setMaxZoomPreference(21.0f);
GroundOverlayOptions overlayBackground = new GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.overlay_background))
.transparency(0.0f)
.bearing(0)
.zIndex(1) // NB! set Z-Index for "background" overlay
.positionFromBounds(borders);
mGoogleMap.addGroundOverlay(overlayBackground);
mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NONE);
GroundOverlayOptions overlayOptions = new GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.overlay))
.transparency(0.0f)
.bearing(0)
.zIndex(2) // NB! set Z-Index for "floor" overlay
.position(OVERLAY_CENTER, 200f);
GroundOverlay overlay = mGoogleMap.addGroundOverlay(overlayOptions);
mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(OVERLAY_CENTER, 18.0f));
}
你可以得到这样的结果:
对于 p.2 问题恕我直言,最简单的方法是通过使用一组地板覆盖来“模拟”室内地图。在这种情况下,您可以通过在地图上添加相应的楼层叠加层来显示必要的楼层,并使用以下setTransparency()
方法显示/隐藏它:use setTransparency(1)
用于您要隐藏的所有楼层,以及setTransparency(0)
需要显示的一层。例如,要显示楼层 #3 的叠加层:
GroundOverlay floor1Overlay = mGoogleMap.addGroundOverlay(floor1OverlayOptions);
GroundOverlay floor2Overlay = mGoogleMap.addGroundOverlay(floor2OverlayOptions);
GroundOverlay floor3Overlay = mGoogleMap.addGroundOverlay(floor2OverlayOptions);
...
floor1Overlay.setTransparency(1);
floor2Overlay.setTransparency(1);
floor3Overlay.setTransparency(0);
或者,您可以使用 on (不是!)对象上的remove()
方法从地图中删除不必要的楼层覆盖,并在需要时重新创建它。为此,您需要在地图上添加地板覆盖对象时存储它:GroundOverlay
GroundOverlayOptions
GroundOverlay floor1Overlay = mGoogleMap.addGroundOverlay(floor1OverlayOptions);
...
floor1Overlay.remove();