防止用户超出地图边界

时间:2013-04-29 03:41:13

标签: java android google-maps google-maps-android-api-2

我试图阻止用户移动到谷歌地图中的某个区域之外。但是,似乎没有一种简单的方法可以做到这一点。第一次问这里是怜悯。

我尝试使用以下功能进行轮询,因为用户滚动,但问题是OnCameraChange不经常启动,因此它的工作速度很快且不准确。我知道必须有一些方法来做到这一点,因为它似乎是一个简单而重要的功能。

private static final LatLng NEBOUND = new LatLng(47.670606, -117.393344);
private static final LatLng SWBOUND = new LatLng(47.661283, -117.411052);
private static final LatLngBounds MAPBOUNDARY = new LatLngBounds(SWBOUND, NEBOUND);
private LatLng lastCenter = new LatLng(47.667454, -117.402309);

  private final OnCameraChangeListener mOnCameraChangeListener = 
            new OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {
            LatLngBounds visibleBounds = guMap.getProjection().getVisibleRegion().latLngBounds;
            if(!MAPBOUNDARY.contains(visibleBounds.northeast) || !MAPBOUNDARY.contains(visibleBounds.southwest)){
                guMap.moveCamera(CameraUpdateFactory.newLatLng(lastCenter));
            }
            else
                lastCenter = guMap.getCameraPosition().target;
            centerLoc.setText(lastCenter.toString());
        }
    };

2 个答案:

答案 0 :(得分:2)

感谢MaciejGórski,我实施了该解决方案 甚至在5毫秒的轮询是相当不稳定的,但它的工作原理 请注意,根据边界的形状和用户屏幕的形状,它们可能无法缩小到足以查看整个区域。

private static final LatLng NEBOUND = new LatLng(47.671781, -117.393352);
private static final LatLng SWBOUND = new LatLng(47.661283, -117.411052);
private static final LatLngBounds MAPBOUNDARY = new LatLngBounds(SWBOUND, NEBOUND);
private LatLng lastCenter = new LatLng(47.667454, -117.402309);
GoogleMap guMap;
private Handler mHandler;

private void checkBoundaries(){
    LatLng tempCenter = guMap.getCameraPosition().target;
    LatLngBounds visibleBounds = guMap.getProjection().getVisibleRegion().latLngBounds;
    if(!MAPBOUNDARY.contains(visibleBounds.northeast) || !MAPBOUNDARY.contains(visibleBounds.southwest)){
        guMap.moveCamera(CameraUpdateFactory.newLatLng(lastCenter));
    }
    else
        lastCenter = tempCenter;
}

private void setUpHandler(){
    mHandler = new Handler(){
            public void handleMessage(Message msg){
                checkBoundaries();
                sendEmptyMessageDelayed(0, 5);
            }
        };
}

答案 1 :(得分:0)

您可以尝试使用旧的民意调查技术onCameraChange,而不是使用map.getCameraPosition()新的闪亮推送技术。

基本上你需要一个Handler,它将获得handleMessage中摄像机位置的值,并且每隔10ms左右就会向此处理程序发送一条消息。在handleMessagesendEmptyMessageDelayed

您也可以使用Runnable代替Message(但这只是品味问题)。