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

2 回答 2

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);
            }
        };
}
于 2013-04-30T16:45:19.533 回答
0

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

基本上你需要一个Handler,它将获取相机位置的值,handleMessage并且你每隔 10ms 左右向这个处理程序发送消息。里面handleMessagesendEmptyMessageDelayed

您也可以使用Runnable代替Message(但这是一个口味问题)。

于 2013-04-29T22:29:32.217 回答