5

我有一个显示地图的 Android 应用程序。默认情况下,地图在其移动后以用户位置为中心(中心根据位置更新进行更新)。

但是我希望用户能够使用手势来导航扔地图。当用户启动导航时,我希望“跟随”停止,并显示一个按钮,以便它可以重新启动。

我如何知道用户何时移动了地图中心?在 GoogleMap.OnCameraChangeListener 上,我不知道更改是由于位置更改还是用户交互引起的。我有一种使用 OnCameraChangeListener 的工作解决方案,但它有点“脏”,我觉得它不是很好:

map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition position) {
                            // gpsPosition contains the last position obtained
            if(isFollowing && gpsPosition!=null && (Math.abs(position.target.latitude - gpsPosition.latitude)>0.000001 || Math.abs(position.target.longitude - gpsPosition.longitude)>0.000001) ){
                isFollowing = false;
                map.getUiSettings().setMyLocationButtonEnabled(true);
            }

        }
    }); 

这个问题有很好的解决方案吗?

4

3 回答 3

4

如果您想检测与地图交互的用户OnCameraChangeListener肯定为时已晚。它可能在用户开始与地图交互后的几秒钟内被调用。

您需要做的是添加 2 个其他侦听器:

  • OnMyLocationButtonClickListener- 知道何时开始跟踪(设置isFollowingtrue
  • OnMyLocationChangeListener-当你isFollowing是时true,打电话GoogleMap.animateCamera给新职位

所以唯一剩下的就是当你设置isFollowingfalse

在您的布局中创建一个不可见的叠加层(就像这里一样,但使用普通View而不是自定义)并分配这个叠加层(the View)一个OnTouchListener(好的,它是第 3 个,我撒谎说你只需要 2 个)。

在这个监听器中总是返回false,而且设置isFollowingfalse。当用户开始与地图交互时,您应该停止自动相机移动。

我还看到您正在显示和隐藏我的位置按钮,因此请在更改isFollowing. 顺便说一句:这样做是个好主意。我也试试。

于 2013-11-11T15:07:28.237 回答
2

我从来没有试过这个,但这里有一些我(秃顶)头顶的想法:

选项#1:自己处理位置变化更新,当位置变化发生时,自己重新定位地图。如果发生似乎与位置变化无关的相机变化事件(例如,5+毫秒后),那可能是用户通过手势修改地图。

选项 #2:子类化 Maps V2MapView并覆盖与触摸相关的方法,例如onTouchEvent(). 除了链接到超类之外,您还会知道从现在开始很快发生的相机更改可能来自用户通过手势修改地图。

选项#3:以上都做。这样,对地图的所有更改都应该触及您的代码,这应该会增加您确定相机更改源的可靠性。

顺便说一句,我提交了功能请求以获得更好的解决方案

于 2013-11-11T13:31:25.383 回答
0

最简单的方法应该是保存地图的中心经度和纬度。现在创建一个 EventListener 并在 if 语句中检查它:

if(oldLongLat != newLongLat){
//Something has moved
}else {
//Nothing has moved
}
于 2013-11-11T13:45:46.897 回答