OSMDroid LocationChange 监听器
OSMDroid LocationChange Listener
我正在创建地图并且我有一个工作正常的 locationOverlay。但是,随着位置的变化,我需要更新一些变量。
我是否将 LocationListener 与 OSMDroid 一起使用?或者有什么内置的东西或我可以覆盖的方法吗?
如果我必须注册一个 locationListener,我该怎么做?
private fun createMap() {
val ctx = applicationContext
Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx))
map = findViewById<View>(R.id.map) as MapView
map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE)
map.getOverlays().add(CopyrightOverlay(this))
mapController = MapController(map)
mLocationOverlay = MyLocationNewOverlay(GpsMyLocationProvider(this), map)
mLocationOverlay.enableMyLocation()
mLocationOverlay.runOnFirstFix {
runOnUiThread {
mapController.zoomTo(14)
mapController.setCenter(mLocationOverlay.myLocation)
mapController.animateTo(mLocationOverlay.myLocation)
}
}
map.overlays.add(mLocationOverlay)
}
我发现您最后的已知位置存储在 LocationOverlay 中。要访问这些变量:mLocationOverlay.myLocationProvider.lastKnownLocation.latitude
经度也一样。
现在我知道从哪里获取我的位置,这就像每秒创建 运行 协程作业并更新 deviceLocation 变量一样简单。
我相信注册监听器可能是更好的方法。它只会在位置更改时触发。但是,使用协同程序,您可以控制间隔。只要间隔不太短,就可以让 UI 看起来更可预测。
确保你的依赖项中有 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
private fun createMap() {
val ctx = applicationContext
Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx))
map = findViewById<View>(R.id.map) as MapView
map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE)
map.getOverlays().add(CopyrightOverlay(this))
mapController = MapController(map)
mapController.animateTo(GeoPoint(DEFAULT_GEOPOINT), DEFAULT_ZOOM, 2)
mLocationOverlay = MyLocationNewOverlay(GpsMyLocationProvider(this), map)
mLocationOverlay.enableMyLocation()
mLocationOverlay.runOnFirstFix {
runOnUiThread {
mapController.animateTo(mLocationOverlay.myLocation, 14.0, 1000)
handleNewLocation()
startLocationUpdates() // <-----Entry Point
}
}
map.overlays.add(mLocationOverlay)
}
private fun startLocationUpdates() {
val updateDeviceLocationJob = locationUpdateJob(1000L)
updateDeviceLocationJob.start()
}
private fun locationUpdateJob(timeInterval: Long): Job {
return CoroutineScope(Dispatchers.Default).launch {
while (isActive) {
handleNewLocation()
delay(timeInterval)
}
}
}
private fun handleNewLocation() {
deviceGoePoint = LatLng(mLocationOverlay.myLocationProvider.lastKnownLocation.latitude,
mLocationOverlay.myLocationProvider.lastKnownLocation.longitude)
}
我正在创建地图并且我有一个工作正常的 locationOverlay。但是,随着位置的变化,我需要更新一些变量。 我是否将 LocationListener 与 OSMDroid 一起使用?或者有什么内置的东西或我可以覆盖的方法吗? 如果我必须注册一个 locationListener,我该怎么做?
private fun createMap() {
val ctx = applicationContext
Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx))
map = findViewById<View>(R.id.map) as MapView
map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE)
map.getOverlays().add(CopyrightOverlay(this))
mapController = MapController(map)
mLocationOverlay = MyLocationNewOverlay(GpsMyLocationProvider(this), map)
mLocationOverlay.enableMyLocation()
mLocationOverlay.runOnFirstFix {
runOnUiThread {
mapController.zoomTo(14)
mapController.setCenter(mLocationOverlay.myLocation)
mapController.animateTo(mLocationOverlay.myLocation)
}
}
map.overlays.add(mLocationOverlay)
}
我发现您最后的已知位置存储在 LocationOverlay 中。要访问这些变量:mLocationOverlay.myLocationProvider.lastKnownLocation.latitude
经度也一样。
现在我知道从哪里获取我的位置,这就像每秒创建 运行 协程作业并更新 deviceLocation 变量一样简单。
我相信注册监听器可能是更好的方法。它只会在位置更改时触发。但是,使用协同程序,您可以控制间隔。只要间隔不太短,就可以让 UI 看起来更可预测。
确保你的依赖项中有 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
private fun createMap() {
val ctx = applicationContext
Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx))
map = findViewById<View>(R.id.map) as MapView
map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE)
map.getOverlays().add(CopyrightOverlay(this))
mapController = MapController(map)
mapController.animateTo(GeoPoint(DEFAULT_GEOPOINT), DEFAULT_ZOOM, 2)
mLocationOverlay = MyLocationNewOverlay(GpsMyLocationProvider(this), map)
mLocationOverlay.enableMyLocation()
mLocationOverlay.runOnFirstFix {
runOnUiThread {
mapController.animateTo(mLocationOverlay.myLocation, 14.0, 1000)
handleNewLocation()
startLocationUpdates() // <-----Entry Point
}
}
map.overlays.add(mLocationOverlay)
}
private fun startLocationUpdates() {
val updateDeviceLocationJob = locationUpdateJob(1000L)
updateDeviceLocationJob.start()
}
private fun locationUpdateJob(timeInterval: Long): Job {
return CoroutineScope(Dispatchers.Default).launch {
while (isActive) {
handleNewLocation()
delay(timeInterval)
}
}
}
private fun handleNewLocation() {
deviceGoePoint = LatLng(mLocationOverlay.myLocationProvider.lastKnownLocation.latitude,
mLocationOverlay.myLocationProvider.lastKnownLocation.longitude)
}