[英]Google map Background color for Map type GoogleMap.MAP_TYPE_NONE
我使用了添加到 Google Map 的平面圖的地面疊加層。 它完美加載。 代碼如下所示。
override fun onMapReady(map: GoogleMap) {
mMap = map;
mMap.setOnGroundOverlayClickListener(this);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(DEFAULT_LAT_LNG, 1F));
mMap.setMapType(GoogleMap.MAP_TYPE_NONE);
mGroundOverlay = mMap.addGroundOverlay(GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromBitmap(bitmap)).anchor(0F, 1F)
.position(DEFAULT_LAT_LNG, floorPlanWidth.toFloat(),
floorPlanHeight.toFloat()));
mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(mGroundOverlay.getBounds(), 0))
}
這將產生如下所附的 UI。
我在這里有兩個問題:
對於第 1 頁,最簡單的方法是使用額外的GroundOverlay
,它是純色 bitmap,由地面覆蓋的背景顏色填充。 正是您的示例圖片可能是這樣的( overlay_background.png
):
您應該將那張圖片用作“背景” GroundOverlay
放置在您的“地板” GroundOverlay
下。
為確保“背景” GroundOverlay
覆蓋整個可見區域,您應該在“地板”覆蓋層上稍微縮放該圖像。 您可以通過GroundOverlayOptions
的.positionFromBounds()
方法來完成。 要獲得遠離center
的“背景”覆蓋范圍radius
,您可以使用以下方法:
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
是Android Utility Library 的 Maps SDK 的一部分。 如何為這里描述的項目添加它。
同樣通過setLatLngBoundsForCameraTarget()
方法,您可以將相機視圖范圍設置為略小於“背景”覆蓋區域,以避免用戶將 map 滾動出“背景”覆蓋范圍時的情況。 您還需要設置最小和最大縮放級別(通過setMinZoomPreference()
和setMaxZoomPreference()
)。
所以總體思路如下圖所示:
要將“背景” GroundOverlay
放置在“地板” GroundOverlay
下,您可以使用GroundOverlayOptions
或GroundOverlay
的.setZIndex()
方法,並將“背景” GroundOverlay
的 Z-Index 設置為小於“地板” GroundOverlay
的 Z-Index 例如Z-Index = 1
表示“背景”, Z-Index = 2
表示地板覆蓋(Z-Index 的默認值為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 問題恕我直言,最簡單的方法是通過使用一組地板覆蓋來“模擬”室內地圖。 在這種情況下,您可以通過將相應的地板覆蓋層添加到 map 來顯示必要的地板,並使用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);
或者,您可以使用GroundOverlayOptions
上的remove()
方法從 map 中刪除不需要的地板覆蓋層(不在GroundOverlay
上。)object 並在再次需要時重新創建它:為此,您需要存儲地板覆蓋層 ZA8CFDE6331BD59EB666F891 時添加到地圖上:
GroundOverlay floor1Overlay = mGoogleMap.addGroundOverlay(floor1OverlayOptions);
...
floor1Overlay.remove();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.