繁体   English   中英

Google Maps Android,在位置感知地图中检测用户互动

[英]Google Maps Android, detect user interation in a location aware map

我有一个显示地图的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);
            }

        }
    }); 

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

如果要检测用户与地图的交互, OnCameraChangeListener肯定为时已晚。 用户开始与地图互动后的几秒钟可能称为“秒”。

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

  • OnMyLocationButtonClickListener知道何时开始跟踪(将isFollowing设置为true
  • OnMyLocationChangeListenerisFollowingtrue ,将GoogleMap.animateCamera调用到新位置

所以剩下的唯一事情就是将isFollowing设置为false

在布局中创建一个不可见的叠加层( 如此处所示 ,但使用普通的View而不是自定义),然后为该叠加层( View )分配一个OnTouchListener (好吧,它是第3个,我撒谎了,只需要2个)。

在此侦听器中始终返回false ,但还将isFollowing设置为false 当用户开始与地图互动时,您应该停止自动照相机移动。

我还看到您正在显示和隐藏我的位置按钮,因此在更改isFollowing的值时执行此isFollowing 顺便说一句:这样做的好主意。 我也会尝试的。

我从来没有尝试过,但是这里有些想法在我(秃顶)的脑海中浮现:

选项#1:处理位置更改会自己更新,方法是在位置更改发生时自己重新定位地图。如果发生的相机更改事件似乎与位置更改无关(例如,在5毫秒后),大概是用户通过手势修改了地图。

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

选项3:执行上述两项操作。 这样,对地图的所有更改都应触摸您的代码,这将增加确定相机更改源的可靠性。

顺便说一句,我提出了功能要求以寻求更好的解决方案

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

if(oldLongLat != newLongLat){
//Something has moved
}else {
//Nothing has moved
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM