Limit camera only on a ground overlay? Google Map Android API v2

独自空忆成欢 提交于 2020-02-15 08:07:06

问题


I'm trying to show a ground overlay with markers on it to my users. I'm trying to restrain the view to only this image placed on the map. I want the user to only see the image as a ground overlay placed on the map and not be able to go to the surrounding map. And if they go over the edge, the gestures will be blocked.

I want something like this:

I don't want this: show-only-ground-overlays-map-android or this:

I tried to set my map.setLatLngBoundsForCameraTarget() to my image bounds but the result is something like the previous image...

The next thing I tried is to set a bunch of LatLng objects all around the ground overlay and check with curScreen.contains(customMapDetectionPoints.get(LatLng Object)) to see if they appear on the viewport. It's does work but I can't stop the camera to go over the edge...

Here my test code so far :

private GroundOverlay groundOverlay;
private GoogleMap globalMap;
private final int DETECTION_POINTS_CUSTOM_MAP = 20;
private List<LatLng>  customMapDetectionPoints = new ArrayList<>();

//Fully Working as suppose to
@Override
public void onMapReady(GoogleMap map) {
           //Other Stuff...
            LatLngBounds mapBounds = groundOverlay.getBounds();
            map.setLatLngBoundsForCameraTarget(mapBounds);
            globalMap = map;

            LatLng northwest = new LatLng( mapBounds.northeast.latitude,  mapBounds.southwest.longitude);
            LatLng northeast = mapBounds.northeast;
            LatLng southeast = new LatLng( mapBounds.southwest.latitude,  mapBounds.northeast.longitude);
            LatLng southwest = mapBounds.southwest;

            //My ground overlay is rectangle so I don't need to follow a path or something like that
            setDetectionPoints(northwest, southwest);
            setDetectionPoints(northeast, southeast);
            setDetectionPoints(northwest, northeast);
            setDetectionPoints(southwest, southeast);

            map.setOnCameraMoveStartedListener(new GoogleMap.OnCameraMoveStartedListener() {
        @Override
        public void onCameraMoveStarted(int i) {
            LatLngBounds curScreen = globalMap.getProjection().getVisibleRegion().latLngBounds;

            CameraPosition cameraPosition = globalMap.getCameraPosition();

            for (int x =0;x<customMapDetectionPoints.size();x++) {
                if (curScreen.contains(customMapDetectionPoints.get(x))) {
                    cancelMapMovement(cameraPosition);
                     Log.d("OUT", "Ground Overlay is outside viewport");
                    return;
                } else {
                    globalMap.getUiSettings().setAllGesturesEnabled(true);
                    Log.d("IN", "Ground Overlay is inside viewport");
                }
            }

        }
    });

 //Add 20 new location between two location
 //Fully Working as suppose to
 public void setDetectionPoints(LatLng fromPos, LatLng toPos) {

    double pointLatitude = fromPos.latitude;
    double pointLongitude = fromPos.longitude;
    double addingValue;
    if (fromPos.latitude == toPos.latitude) {

        addingValue = (toPos.longitude - fromPos.longitude)/DETECTION_POINTS_CUSTOM_MAP;

        for (int i = 0; i < DETECTION_POINTS_CUSTOM_MAP; i++) {
            pointLongitude += addingValue;
            LatLng pointsPos = new LatLng(pointLatitude, pointLongitude);
            customMapDetectionPoints.add(pointsPos);
        }


    } else if (fromPos.longitude == toPos.longitude) {
        addingValue = (toPos.latitude - fromPos.latitude)/DETECTION_POINTS_CUSTOM_MAP;
        for (int i = 0; i < DETECTION_POINTS_CUSTOM_MAP; i++) {

            pointLatitude += addingValue;
            LatLng pointsPos = new LatLng(pointLatitude, pointLongitude);
            customMapDetectionPoints.add(pointsPos);
        }


    }
}
 //The problem is here! 
 public void cancelMapMovement(CameraPosition camPos ) {
    //HOW CAN I STOP THE MOVEMENT OVER THE GROUND OVERLAY EDGE
    //And make sure that the user dosen't see over the edge
    globalMap.getUiSettings().setAllGesturesEnabled(false);
    globalMap.moveCamera(CameraUpdateFactory.newCameraPosition(camPos));

}

At this point I think I have two possible solutions:

1- Only use the setLatLngBoundsForCameraTarget() function and set a offset or margin to the camera. But is it possible and will it work for my use case ?

2- Solve my camera restriction problem with the code already written

Thanks for helping! Suggest other solution if you find one!

I will provide more info if wanted.

来源:https://stackoverflow.com/questions/41606414/limit-camera-only-on-a-ground-overlay-google-map-android-api-v2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!