【问题标题】:OSMDroid LocationChange ListenerOSMDroid LocationChange 监听器
【发布时间】:2021-12-03 23:50:25
【问题描述】:

我正在创建一个地图,并且我有一个可以正常工作的 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)

    }

【问题讨论】:

    标签: android kotlin osmdroid


    【解决方案1】:

    我发现您的最后一个已知位置存储在 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)
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2013-12-24
      • 2014-12-13
      • 2014-02-21
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      相关资源
      最近更新 更多