阻止用户走出地图边界

问题描述:

我试图阻止用户移动到谷歌地图的某个区域之外。但是,似乎并没有一个简单的方法来做到这一点。第一次在这里问这么仁慈。阻止用户走出地图边界

我已经尝试了下面的努力来轮询用户滚动,但问题是,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()); 
     } 
    }; 
+0

的重复:http://*.com/questions/14977078/limit-scrolling-and-zooming-google-maps-android-api-v2/14977861#14977861 – 2013-04-29 06:46:57

+0

@thibaultd这就是我什么尝试,但OnCameraChange不经常发射。上面有一条评论,看起来好像可以工作,但是它是针对APIv1的,看起来像是矫枉过正,一定有更好的办法。 – kag0 2013-04-29 18:11:45

我实施的解决方案由于对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); 
      } 
     }; 
} 

而不是使用新的和有光泽的推送技术是onCameraChange的,你可以尝试使用旧的调查技术:map.getCameraPosition()

基本上你需要一个Handler,它会得到handleMessage中相机位置的值,并且你每隔10ms左右发送一次消息给这个处理器。在handleMessage里面做sendEmptyMessageDelayed

您也可以使用Runnable而不是Message(但这是一个有趣的问题)。

+0

不熟悉处理程序,所以让我检查我是否有这个权利。我创建一个Handler,向它发送一个空的消息,当它收到一条消息时,它会更新lastCenter(我的代码如上),然后在延迟后自己发送另一个空消息? – kag0 2013-04-30 01:54:52

+0

也只是为了确认,如果我使用消息,那么一切都应该发生在一个线程中吗? – kag0 2013-04-30 02:33:16

+0

是的(在handleMessage中使用你的代码)和是的(一切正在线程处理器创建)。 – 2013-04-30 09:33:34