谷歌地图Android版,如何在位置感知地图中检测用户交互

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

        }
    }); 

有没有一个好的解决方案来解决这个问题?

3个回答

4
如果您想检测用户与地图的交互,使用OnCameraChangeListener已经太晚了。它可能在用户开始与地图交互几秒钟后才被调用。
您需要做的是添加另外两个监听器:
- OnMyLocationButtonClickListener - 用于知道何时开始跟踪(将isFollowing设置为true) - OnMyLocationChangeListener - 当isFollowingtrue时,调用GoogleMap.animateCamera来到新位置
所以唯一剩下的事情就是当您将isFollowing设置为false时:
在布局中创建一个不可见的覆盖层(像这里一样,但使用普通的View而不是自定义),并为此覆盖层(即View)分配一个OnTouchListener(好吧,这是第三个,我谎称您只需要两个)。
在此侦听器中,始终返回false,但同时将isFollowing设置为false。这样当用户开始与地图交互时,您应该停止自动相机移动。
我还看到您正在显示和隐藏我的位置按钮,所以在更改isFollowing的值时,请执行此操作。顺便说一句:这是个好主意,我也会尝试。

2

我从未尝试过这个,但以下是我(秃顶)脑海中的一些想法:

选项#1:通过在位置更改时自行重新定位地图来自己处理位置更改更新。如果发生相对于位置更改没有关联的摄像机更改事件(例如5+毫秒后),那么很可能是用户通过手势修改了地图。

选项#2:子类化Maps V2 MapView并覆盖诸如onTouchEvent()之类的与触摸相关的方法。除了链接到超类之外,您还应该知道即将发生的摄像机更改很可能是用户通过手势修改地图。

选项#3:同时执行上述两种操作。这样,所有对地图的更改都应该接触到您的代码,这应该增加您确定摄像机更改源的可靠性。

顺便说一句,我已经提交了一个更好解决方案的功能请求


1
一个简单的答案是在您的请求下发布:http://code.google.com/p/gmaps-api-issues/issues/detail?id=4636#c21 - Mateu
@Mateu:那是上面的选项#1。 - CommonsWare

0
最简单的方法应该是保存地图中心点的经度和纬度。现在创建一个事件监听器并在 if 语句中进行检查:
if(oldLongLat != newLongLat){
//Something has moved
}else {
//Nothing has moved
}

这如何区分由于位置而导致的更改与由用户操作(例如用户平移地图)而导致的更改? - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接