问:如何防止用户在 android 上的 google 地图中留下自定义地图叠加层

Q: How to keep user from leaving custom map overlay in google maps on android

我试图阻止用户离开我在 google 地图上为 android 设备设置的自定义覆盖区域。

问题是我所有试图将用户的视野保持在 GPS 限制范围内的尝试最终都互相争斗并来回弹跳地图。

我所做的是设置一个侦听器和多种方法来在相机超出范围时移动它:

map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {

    @Override
    public void onCameraChange(CameraPosition position) {
        firstMapRegionCheck = true;

        VisibleRegion vr = mMap.getProjection().getVisibleRegion();
        double left = vr.latLngBounds.southwest.longitude;
        double top = vr.latLngBounds.northeast.latitude;
        double right = vr.latLngBounds.northeast.longitude;
        double bottom = vr.latLngBounds.southwest.latitude;

        zoomFix(position);
        checkXAxis(position, left, top, right, bottom);
        checkYAxis(position, left, top, right, bottom);
        }
    });
}

我先得到所有的经纬度点。然后我 运行 他们通过一个方法 "zoomFix" 那

public void zoomFix(CameraPosition position){
    if (position.zoom < DEFAULT_ZOOM) {
        CameraUpdate defaultZoomMove = CameraUpdateFactory.zoomTo(DEFAULT_ZOOM);
        mMap.moveCamera(defaultZoomMove);
    }
    else if (position.zoom > 17){
        CameraUpdate zoomOut = CameraUpdateFactory.zoomTo(DEFAULT_ZOOM);
        mMap.moveCamera(zoomOut);
    }
}

最初我同时检查了纬度和经度都太小和太大。我以为这就是他们来回打架的原因。

所以我创建了两种方法,一种检查 x 坐标,一种检查 y 坐标。

我想通过拆分 x 和 y 坐标 - 这可能已经解决了问题。但是没有。

检查 X 轴:

public void checkXAxis(CameraPosition position, double left, double top, double right, double bottom){
    if (left < -87.896567) {
        LatLng southwest = new LatLng(bottom, -87.896567);
        LatLng northeast = new LatLng(top, right);
        LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
        CameraUpdate camerageUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
        mMap.moveCamera(camerageUpdate);
        zoomFix(position);
    }
    else if (right > -87.874628)
    {
        LatLng southwest = new LatLng(bottom, left);
        LatLng northeast = new LatLng(top, -87.874628);
        LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
        CameraUpdate camerageUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
        mMap.moveCamera(camerageUpdate);
        zoomFix(position);
    }
}

检查 Y 轴:

    public void checkYAxis(CameraPosition position, double left, double top, double right, double bottom){
    if (top > 43.178949){
        LatLng southwest = new LatLng(bottom, left);
        LatLng northeast = new LatLng(43.179501, right);
        LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
        CameraUpdate camerageUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
        mMap.moveCamera(camerageUpdate);
        zoomFix(position);
        if (firstMapRegionCheck){
            firstMapRegionCheck = false;
            checkXAxis(position, left, top, right, bottom);
        }
    }
    else if (bottom < 43.169292){
        LatLng southwest = new LatLng(43.169292, left);
        LatLng northeast = new LatLng(top, right);
        LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
        CameraUpdate camerageUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
        mMap.moveCamera(camerageUpdate);
        zoomFix(position);
        if (firstMapRegionCheck){
            firstMapRegionCheck = false;
            checkXAxis(position, left, top, right, bottom);
        }
    }

无论如何,如果有人能在再次点击 onCameraChange 侦听器(我认为是问题所在)之前弄清楚如何防止修复相互冲突并且没有完全解决问题,我将不胜感激!

谢谢!

设置侦听器:

mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition position) {
            VisibleRegion vr = mMap.getProjection().getVisibleRegion();
            double left = vr.latLngBounds.southwest.longitude;
            double top = vr.latLngBounds.northeast.latitude;
            double right = vr.latLngBounds.northeast.longitude;
            double bottom = vr.latLngBounds.southwest.latitude;

            zoomFix(position);
            checkXYAxis(left, top, right, bottom);
        }
    });

缩放检查方法:

public void zoomFix(CameraPosition position) {
    if (position.zoom < DEFAULT_ZOOM) {
        CameraUpdate defaultZoomMove = CameraUpdateFactory.zoomTo(DEFAULT_ZOOM);
        mMap.moveCamera(defaultZoomMove);
    } else if (position.zoom > 17) {
        CameraUpdate zoomOut = CameraUpdateFactory.zoomTo(DEFAULT_ZOOM);
        mMap.moveCamera(zoomOut);
    }
}

X 和 Y 坐标范围:

public void checkXYAxis(double left, double top, double right, double bottom) {
    //X
    if (left < -87.896567) {
        left = -87.896567;
    }
    else if (right > -87.874628) {
        right = -87.874628;
    }
    //Y
    if (top > 43.178949) {
        top = 43.169292;
    }
    else if (bottom < 43.169292) {
        bottom = 43.169292;
    }

    //update camera position
    LatLng southwest = new LatLng(bottom, left);
    LatLng northeast = new LatLng(top, right);
    LatLngBounds newBounds = new LatLngBounds(southwest, northeast);
    CameraUpdate update = CameraUpdateFactory.newLatLngBounds(newBounds, 0);
    mMap.moveCamera(update);
}