java - 防止用户超出 map 边界

标签 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());
        }
    };

最佳答案

感谢 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);
            }
        };
}

关于java - 防止用户超出 map 边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16270863/

相关文章:

javascript - React-native 的流媒体、Youtube 和离线视频播放器组件

android - 应用程序停止响应多个地理编码器请求

android - OnCameraChangeListener 响应不够——还有其他方法吗?

java - JTable自动滚动

java - 捕获服务器响应代码

android - 无法获取位置

javascript - 使用 react-places-autocomplete 只希望城市和相关国家在建议中

java - ImageIO.write 是否缓冲?

java - HashMap<Integer, Integer> 的 jol 足迹

android - 不确定如何将 Cursor 转换为该方法的返回类型