2013-04-29 59 views
3

我試圖阻止用戶移動到谷歌地圖的某個區域之外。但是,似乎並沒有一個簡單的方法來做到這一點。第一次在這裏問這麼仁慈。阻止用戶走出地圖邊界

我已經嘗試了下面的努力來輪詢用戶滾動,但問題是,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://stackoverflow.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

回答

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

而不是使用新的和有光澤的推送技術是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