簡體   English   中英

Google map Map 類型 GoogleMap.MAP_TYPE_NONE 的背景顏色

[英]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. 如何將背景顏色更改為我選擇的顏色?
  2. 如何以編程方式放大和縮小? 假設我想在 map 加載后立即放大 5F。

對於第 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;
}

其中SphericalUtilAndroid Utility Library 的 Maps SDK 的一部分。 如何為這里描述的項目添加它。

同樣通過setLatLngBoundsForCameraTarget()方法,您可以將相機視圖范圍設置為略小於“背景”覆蓋區域,以避免用戶將 map 滾動出“背景”覆蓋范圍時的情況。 您還需要設置最小和最大縮放級別(通過setMinZoomPreference()setMaxZoomPreference() )。

所以總體思路如下圖所示:

想法描述

要將“背景” GroundOverlay放置在“地板” GroundOverlay下,您可以使用GroundOverlayOptionsGroundOverlay.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM