iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

今天要介紹的是 Maps SDK for Android Utility 的最後一個部分--LayerManager。

Utility 內有幾個 Manager 結尾的類別,主要是為了協助開發者管理不同類型的點擊事件,因為實務上,App 內的地圖可能會同時加入許多不同種類的圖層。

以下的步驟會是說明在多圖層的情況下,如何使用這些 Manager 們協助管理圖層。

實作

建立所需類型的 Manager

在設定圖層前先將會使用的 Manager 們實例化。

val markerManager = MarkerManager(map)
val groundOverlayManager = GroundOverlayManager(map!!)
val polygonManager = PolygonManager(map)
val polylineManager = PolylineManager(map)

將建立好的 Manager 傳入圖層的建構式

val clusterManager =
    ClusterManager<StoreClusterItem>(context, map, markerManager)
val geoJsonLineLayer = GeoJsonLayer(
    map,
    R.raw.geojson_file,
    context,
    markerManager,
    polygonManager,
    polylineManager,
    groundOverlayManager
)
val kmlPolylineLayer = KmlLayer(
    map,
    R.raw.kml_file,
    context,
    markerManager,
    polygonManager,
    polylineManager,
    groundOverlayManager,
    null
)

使用 xxxManager.newCollection() 新增個別的地圖項目

當我們需要新增其他的 Marker 或 Polygon 等物件到地圖上時,有別於前面幾天學到的,直接將物件新增至地圖上,官方建議可以使用以下的方式新增。

以 Marker 來說,應該要透過 MarkerManager.newCollection() 建立一個新的 Collection 再加入 Marker

val markerCollection =
    markerManager.newCollection()
markerCollection.addMarker(
    MarkerOptions()
        .position(LatLng(51.150000, -0.150032))
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
        .title("Unclustered marker")
)

也可以傳入字串作為唯一碼,之後可以從 Manager 身上拿到相同的 Collection

// 建立新的 Collection
MarkerManager.newCollection("THE_VERY_UNIQUE_ID")

// 取得以該 ID 建立的 Collection
MarkerManager.getCollection("THE_VERY_UNIQUE_ID")

處理點擊事件

這是原本 KML 圖層的點擊事件

kmlPolylineLayer.addLayerToMap()
kmlPolylineLayer.setOnFeatureClickListener { feature: Feature ->
    // 處理事件點擊
}

新加入的其他 Marker 或 Polygon 類的圖形,可以針對該 Collection 設定點擊事件,例如:


markerCollection.setOnMarkerClickListener { marker: Marker ->
    Toast.makeText(
        context,
        "Marker clicked: ${marker.title}",
        Toast.LENGTH_SHORT
    ).show()
    false
}

參考資料

小結

一開始看官方文件的時候,實在是有點看不太懂,但反覆翻了一下 Source code 之後,就大概能夠理解這些類別存在的目的。其實就是為了讓多圖層狀態下處理各圖層事件時,可以更有效的管理與分類。

今天礙於賽程時間的限制,只有照著文件做一些簡單的介紹,也許鐵人賽結束後,有時間可以再多寫幾個測試專案,比較使用 Manager 前後的差異。

以上就是今天的內容,寫得不好的地方還請各位大大包涵,如果可以非常歡迎留言討論或指教,謝謝大家。

明天見囉~


上一篇
Day 23: Maps SDK for Android Utility–Marker Clustering 標記叢集
下一篇
Day 25: Maps SDK for Android Utility 的運算工具與 Google Directions API Polyline Decoding
系列文
Google Maps SDK for Android 與 GIS App 開發筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言