Java 防止用户超出地图边界

Java 防止用户超出地图边界,java,android,google-maps,google-maps-android-api-2,Java,Android,Google Maps,Google Maps Android Api 2,我试图阻止用户移动到谷歌地图的某个区域之外。然而,似乎没有一个简单的方法来做到这一点。第一次在这里问,所以发发慈悲吧 我尝试了下面的方法,试图在用户滚动时进行投票,但问题是OnCameraChange没有足够频繁地触发,因此它的工作不稳定且不准确。我知道一定有办法做到这一点,因为这似乎是一个简单而重要的功能 private static final LatLng NEBOUND = new LatLng(47.670606, -117.393344); private static final

我试图阻止用户移动到谷歌地图的某个区域之外。然而,似乎没有一个简单的方法来做到这一点。第一次在这里问,所以发发慈悲吧

我尝试了下面的方法,试图在用户滚动时进行投票,但问题是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());
        }
    };

您可以尝试使用旧的轮询技术,而不是使用全新的推送技术(即
onCameraChange
),即
map.getCameraPosition()

基本上,您需要一个
处理程序
,它将在
handleMessage
中获取摄像头位置的值,并且您每隔10毫秒左右向该处理程序发送一次消息。内部
handleMessage
do
sendEmptyMessageDelayed


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

多亏了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);
            }
        };
}

重复:@thibaultd这是我正在尝试的,但OnCameraChange的发射频率不够。在你的上面有一条评论,看起来它会起作用,但它是针对APIv1的,似乎有些过分,必须有更好的方法。不熟悉处理程序,所以让我检查一下我是否有这个权利。我创建了一个处理程序,向它发送一条空消息,当它收到一条消息时,它会更新lastCenter(上面的代码),然后在延迟后向自己发送另一条空消息?另外,只是为了确认,如果我使用消息,那么所有事情都应该在一个线程中发生,对吗?是(使用handleMessage中的代码)和是(线程处理程序中创建的线程处理程序上发生的所有事情)。