我希望在 MapBox 的 Android SDK 中检测 map 运动的完全结束。我所说的完全结束是指不再有用户交互(触摸)和相机移动(触摸移动或挥动惯性)。
由于 SDK 中没有这样的回调,我在 MapView
上组合了两个监听器,OnTouchListener
和 OnMapChangedListener
就像这样(在 Kotlin 中但很清楚):
mapView.setOnTouchListener { _, event ->
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
listener?.onMapDragBegin()
}
MotionEvent.ACTION_UP -> {
listener?.onMapDragEnd()
}
}
false
}
mapView.addOnMapChangedListener { c ->
when (c) {
MapView.REGION_WILL_CHANGE, MapView.REGION_WILL_CHANGE_ANIMATED -> {
listener?.onMapMovementBegin()
}
MapView.REGION_DID_CHANGE, MapView.REGION_DID_CHANGE_ANIMATED -> {
listener?.onMapMovementEnd()
}
}
}
监听器等待两个事件结束。这工作得很好,除了一个小细节:flinging 时,两个结束事件都会在用户停止触摸屏幕时发送,并且只有在 REGION_WILL_CHANGE_ANIMATED
map 更改之后才会被调用。所以有那么一刻我不知道 map 是否还在移动。在日志中看起来像这样:
19:23:42.431: Map touch started
19:23:42.537: Map region change started
19:23:42.538: Map region change ended
...
19:23:42.570: Map region change started
19:23:42.570: Map region change ended
19:23:42.577: Map touch ended
19:23:42.577: Map movement ended at -122,420511, 37,748315
// Both touch and movement now have ended according to the MapView
// Fling inertia begins
19:23:42.582: Map region change started
19:23:43.154: Map region change ended
19:23:43.154: Map movement ended at -122,424123, 37,741793
我需要在运动结束后进行 API 调用。如果 map 再次开始移动,我将取消任何 Activity 调用,所以这不是一个大问题,但我想知道 SDK 是否提供了一种方法来避免每次用户滑动 map 时都进行此调用/取消/调用。例如,我想过在移动结束时检查任何滚动速度,但找不到任何方法来访问它。
最佳答案
有一个方法OnCameraIdleListener ,它似乎出现在最新版本的 SDK 中。当相机移动结束时调用它。
关于android - 在 MapBox Android 中检测运动的完全结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42792975/