<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Compose中我們應該怎麼使用地圖呢?像之前我們在xml裡面建立MapView,都是在Activity裡面,管理MapView生命週期,和其他的監聽器,Compose裡面怎麼搞?
下面我們以高德地圖為例,在Compose中建立地圖MapView,然後用AndroidView新增MapView,像下面這樣:
AndroidView(modifier = Modifier, factory = { MapView }){...}
我們看到,高德地圖官網,給開發者的建議:
所以我們需要做什麼,大家曉得了哇,生命週期回撥我們要拿到,那我們應該怎麼搞?
我們需要用到LocalLifecycleOwner.current.lifecycle
去新增生命週期觀察者, LifecycleObserver
是一個介面,它長下面這樣:
我們看註釋可以看到,我們可以使用DefaultLifecycleObserver或者LifecycleEventObserver, DefaultLifecycleObserver
裡面它提供了所有的生命週期事件的回撥,並且預設情況下都是什麼都不做。 LifecycleEventObserver,它提供了一個onStateChanged
方法,所有的生命週期事件都可以在這裡被接受到。
所以,我們這裡就使用LifecycleEventObserver,為啥懂的都懂。
我們有了2個需要初始化的東西,一個是MapView,一個是新增生命週期觀察者。
為什麼要新增生命週期觀察者,看了上面的官方檔案應該知道是為什麼,是需要管理地圖的生命週期,下面我們來講講如何做,該怎麼做。
val context = LocalContext.current // aMapOptionsFactory: () -> AMapOptions = { AMapOptions() } val mapView = remember { MapView(context, aMapOptionsFactory()).apply{ id = R.id.map } } // 新增MapView AndroidView(modifier = modifier, factory = { mapView })
我們來拆解一下,如何新增生命週期管理者,我們給大家聊聊:registerComponentCallbacks,這個ComponentCallbacks裡面提供了2個方法: onConfigurationChanged
、onLowMemory
onConfigurationChanged
: 裝置設定發生改變,元件還在執行時
onLowMemory
:系統執行的記憶體不足時,可以通過實現該方法去釋放記憶體或不需要的資源,我們需要在這個方法裡面,呼叫MapView#onLowMemory
在上面官方檔案中,我們看到地圖的生命週期管理,需要呼叫下面4個方法: MapView#onCreate
、MapView#onResume
、MapView#onPause
、MapView#onDestory
,有了這些前奏,我們就知道怎麼寫地圖生命週期的擴充套件方法了。
// 管理地圖生命週期 private fun MapView.lifecycleObserver(): LifecycleEventObserver = LifecycleEventObserver { _, event -> when (event) { Lifecycle.Event.ON_CREATE -> this.onCreate(Bundle()) Lifecycle.Event.ON_RESUME -> this.onResume() // 重新繪製載入地圖 Lifecycle.Event.ON_PAUSE -> this.onPause() // 暫停地圖的繪製 Lifecycle.Event.ON_DESTROY -> this.onDestroy() // 銷燬地圖 else -> {} } } private fun MapView.componentCallbacks(): ComponentCallbacks = object : ComponentCallbacks { // 裝置設定發生改變,元件還在執行時 override fun onConfigurationChanged(config: Configuration) {} // 系統執行的記憶體不足時,可以通過實現該方法去釋放記憶體或不需要的資源 override fun onLowMemory() { // 呼叫地圖的onLowMemory this@componentCallbacks.onLowMemory() } }
@Composable private fun MapLifecycle(mapView: MapView) { val context = LocalContext.current val lifecycle = LocalLifecycleOwner.current.lifecycle DisposableEffect(context, lifecycle, mapView) { val mapLifecycleObserver = mapView.lifecycleObserver() val callbacks = mapView.componentCallbacks() // 新增生命週期觀察者 lifecycle.addObserver(mapLifecycleObserver) // 註冊ComponentCallback context.registerComponentCallbacks(callbacks) onDispose { // 刪除生命週期觀察者 lifecycle.removeObserver(mapLifecycleObserver) // 取消註冊ComponentCallback context.unregisterComponentCallbacks(callbacks) } } }
使用起來也很容易,先初始化MapView然後新增到AndroidView,最後新增MapView的生命週期控制:
val context = LocalContext.current val mapView = remember { MapView(context, aMapOptionsFactory()).apply{ id = R.id.map } } AndroidView(modifier = modifier, factory = { mapView }) MapLifecycle(mapView)
這樣只能說滿足我們的正常地圖顯示,實際上我們開發過程中,常見的地圖拖拽選點、定位藍點、標記位等都需要我們去擴充套件。
拿地圖拖拽選點功能來說,我們就需要在MapLifecycle新增2個生命週期的回撥,onResume和onPause
MapLifecycle( mapView = mapView, // 從mapView.lifecycleObserver回撥回來即可 onResume = { mapView.map.apply{ setOnMapLoadedListener(...) setOnCameraChangeListener(...) } }, onPause = { mapView.map.apply{ setOnMapLoadedListener(null) setOnCameraChangeListener(null) } } )
剩下的功能,都是拿AMap物件去做事情,新增覆蓋物,移動相機鏡頭等等。
注意: 初始化地圖的時候,傳入的aMapOptionsFactory,可以從外面初始化好傳進來。
aMapOptionsFactory: () -> AMapOptions = { AMapOptions() }
Compose整合的高德地圖效果
以上就是Android開發Compose整合高德地圖範例的詳細內容,更多關於Android Compose整合高德地圖的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45