#android #kotlin #osmdroid
#Android #котлин #осмдроид
Вопрос:
Я создаю карту, и у меня есть карта местоположения, которая отлично работает. Однако мне нужно обновить некоторые переменные по мере изменения местоположения. Использую ли я определитель местоположения с осмдроидом? Или есть что-то встроенное или метод, который я могу переопределить? Если мне действительно нужно зарегистрировать список объектов, как мне это сделать?
private fun createMap() { val ctx = applicationContext Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx)) map = findViewByIdlt;Viewgt;(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) }
Ответ №1:
Я обнаружил, что ваше последнее известное местоположение хранится в LocationOverlay. Для доступа к этим переменным: mLocationOverlay.myLocationProvider.lastKnownLocation.latitude
и то же самое для долготы.
Теперь, когда я знал, где найти свое местоположение, это было так же просто, как создать задание сопрограммы для запуска в любую секунду и обновления переменной deviceLocation.
Я уверен, что может быть лучший способ, зарегистрировав слушателя. Он будет срабатывать только при изменении местоположения. Однако с помощью сопрограмм вы можете контролировать интервал. Придание пользовательскому интерфейсу более предсказуемого вида, если интервал не слишком короткий.
Убедитесь, что у вас есть implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
в ваших зависимостях
private fun createMap() { val ctx = applicationContext Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx)) map = findViewByIdlt;Viewgt;(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() // lt;-----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) }