Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 地图类型的谷歌地图背景色GoogleMap.map\u type\u无_Android_Google Maps_Android Mapview_Android Maps Utils - Fatal编程技术网

Android 地图类型的谷歌地图背景色GoogleMap.map\u type\u无

Android 地图类型的谷歌地图背景色GoogleMap.map\u type\u无,android,google-maps,android-mapview,android-maps-utils,Android,Google Maps,Android Mapview,Android Maps Utils,我使用了添加到谷歌地图的我的平面图的地面覆盖图。它装得很好。代码如下所示 override fun onMapReady(map: GoogleMap) { mMap = map; mMap.setOnGroundOverlayClickListener(this); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(DEFAULT_LAT_LNG, 1F)); mMap.setMapType(GoogleMap

我使用了添加到谷歌地图的我的平面图的地面覆盖图。它装得很好。代码如下所示

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))
}
这将产生如下所附的用户界面

我这里有两个问题:

  • 如何将背景色更改为我选择的颜色
  • 如何以编程方式放大和缩小?假设我想在地图加载后立即放大5F

  • 对于p.1,最简单的方法是使用附加的
    GroundOverlay
    ,它是由地面覆盖的背景色填充的纯色位图。您的示例图片可以是这样的(
    overlay\u background.png
    ):

    您应该将该图片用作“背景”
    GroundOverlay
    放置在您的“地板”
    GroundOverlay
    s下方

    为确保“背景”
    GroundOverlay
    覆盖整个可见区域,应在“地板”覆盖层上稍微缩放该图像。您可以通过
    地面覆盖选项的方法执行此操作。要获取“背景”覆盖边界
    半径
    距离
    中心的距离
    ,可以使用如下方法:

    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
    是的一部分。如何为描述的项目添加它

    另外,通过该方法,您可以将相机视图边界设置为略小于“背景”覆盖区域,以避免用户将地图滚动出“背景”覆盖边界时出现的情况。您还需要设置最小和最大缩放级别(通过和)

    因此,总体思路如下图所示:

    要将“背景”
    GroundOverlay
    放置在“地板”
    GroundOverlay
    下,您可以使用or的
    .setZIndex()
    方法,并将“背景”
    GroundOverlay
    的Z索引设置为小于“地板”
    GroundOverlay
    的Z索引,例如,“背景”的Z索引=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));
    }
    
    您可以得到这样的结果:

    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;
    }
    

    对于p.2问题IMHO,最简单的方法是通过使用地板覆盖集“模拟”室内地图。在这种情况下,您可以通过向地图添加相应的地板覆盖来显示必要的地板,并使用以下方法显示/隐藏它:对所有要隐藏的地板使用
    使用setTransparency(1)
    ,对一个需要显示的地板使用
    设置透明度(0)
    。例如,对于显示楼板#3的覆盖:

    或者,您可以使用
    GroundOverlay
    (而不是
    GroundOverlayOptions
    !)对象上的方法从地图中删除不必要的楼层覆盖,并在需要时重新创建它。为此,您需要在地图上添加地板覆盖对象时存储该对象:

    GroundOverlay floor1Overlay = mGoogleMap.addGroundOverlay(floor1OverlayOptions);
    ...
    floor1Overlay.remove();
    

    谢谢你这么详细的解释。我还有一个问题,我正在苦苦思索。如果可能的话,请你看一下好吗。