我有一个显示地图的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);
}
}
});
这个问题有一个很好的解决方案吗?
答案 0 :(得分:3)
如果您想检测用户与地图OnCameraChangeListener
进行互动肯定为时已晚。用户开始与地图交互后可能会被称为秒。
你需要做的是添加另外两个听众:
OnMyLocationButtonClickListener
- 知道何时开始跟踪(将isFollowing
设置为true
)OnMyLocationChangeListener
- 当isFollowing
为true
时,请致电GoogleMap.animateCamera
新职位所以剩下的就是将isFollowing
设置为false
:
在您的布局中创建一个不可见的叠加层(like here,但使用正常的View
而不是自定义)并将此叠加层(View
)指定为OnTouchListener
(好的,它是第3,我说你只需要2)。
在此侦听器中始终返回false
,但也将isFollowing
设置为false
。当用户开始与地图交互时,您应停止自动相机移动。
我也看到你正在显示并隐藏我的位置按钮,所以在你更改isFollowing
的值时这样做。顺便提一:这样做的好主意。我也会尝试。
答案 1 :(得分:2)
我从来没有尝试过这个,但是这里有一些关于我(秃顶)头顶的想法:
选项#1:自动处理位置更改更新,方法是在位置更改进入时自行重新定位地图。如果发生的相机更改事件似乎与位置更改无关(例如,5 +毫秒)后来),这可能是用户通过手势修改地图。
选项#2:对地图V2 MapView
进行子类化,并覆盖与onTouchEvent()
等触摸相关的方法。除了链接到超类之外,您还会知道从现在开始很快发生的相机更改可能来自用户通过手势修改地图。
选项#3:执行以上两种操作。这样,对地图的所有更改都应该触及您的代码,这样可以提高确定相机更改源的可靠性。
答案 2 :(得分:0)
最简单的方法应该是保存地图的中心经度和纬度。现在创建一个Event Listener并在if语句中检查它:
if(oldLongLat != newLongLat){
//Something has moved
}else {
//Nothing has moved
}