【Android 入門開發實戰:口罩地圖】Google Map 結合口罩資料

 

【Android 入門開發實戰:口罩地圖】線上免費講義課程目錄

在 MapActivity 加入之前下載口罩資料的方法 getPharmacyData,可以參考該專案的 MainActivity。

下載口罩資料

private fun getPharmacyData() {
    //顯示忙碌圈圈
    progressBar.visibility = View.VISIBLE

    OkHttpUtil.mOkHttpUtil.getAsync(PHARMACIES_DATA_URL, object : OkHttpUtil.ICallback {
        override fun onResponse(response: Response) {
            val pharmaciesData = response.body?.string()

            Log.d("QQQ", "pharmaciesData:$pharmaciesData")

            pharmacyInfo = Gson().fromJson(pharmaciesData, PharmacyInfo::class.java)

            runOnUiThread {
                //關閉忙碌圈圈
                progressBar.visibility = View.GONE
                addAllMaker()
            }

        }

        override fun onFailure(e: okio.IOException) {
            Log.d("HKT", "onFailure: $e")

            //關閉忙碌圈圈
            progressBar.visibility = View.GONE
        }
    })
}

加入所有口罩資料標記

private fun addAllMaker() {
    pharmacyInfo?.features?.forEach { feature ->
        val pinMarker = googleMap?.addMarker(
            MarkerOptions()
                .position(
                    LatLng(
                        feature.geometry.coordinates[1],
                        feature.geometry.coordinates[0],
                    )
                )
                .title(feature.property.name)
                .snippet(
                    "${feature.property.mask_adult}," +
                            "${feature.property.mask_child}"
                )
        )
    }

}

將所有口罩資料,加入地圖標記,移動畫面過程中,會有很明顯會出現效能使用上的問題,實際上只要載入螢幕畫面範圍的口罩資料即可,螢幕畫面外的口罩資料可以清除。

實作 OnInfoWindowClickListener

class MapActivity : AppCompatActivity(), OnMapReadyCallback, GoogleMap.OnInfoWindowClickListener {

}

設定資訊視窗、資訊視窗點擊監聽

override fun onMapReady(googleMap: GoogleMap) {
    this.googleMap = googleMap
    googleMap.moveCamera(
        CameraUpdateFactory.newLatLngZoom(
            defaultLocation, 15f
        )
    )
googleMap?.setInfoWindowAdapter(MyInfoWindowAdapter(mContext))
googleMap?.setOnInfoWindowClickListener(this)

//        getLocationPermission()
}

資訊視窗點擊事件

資訊視窗,點擊後跳轉到詳細資訊頁

override fun onInfoWindowClick(marker: Marker?) {
    marker?.title?.let { title ->
//            Log.d("HKT", title)

        val filterData =
            pharmacyInfo?.features?.filter {
                it.property.name == (title)
            }

        if (filterData?.size!! > 0) {
            val intent = Intent(this, PharmacyDetailActivity::class.java)
            intent.putExtra("data", filterData.first())
            startActivity(intent)
        } else {
            Log.d("HKT", "查無資料")
        }
    }
}

輸出結果

程式碼範例

範例名稱:Google Map 結合口罩資料
開發人員:HKT (侯光燦)
程式語言:Kotlin
開發環境:Android Studio 4.1.2 & Android 11 & Kotlin 1.4.30
授權範圍:使用時必須註明出處且不得為商業目的之使用
範例下載點:點我下載

這個網誌中的熱門文章

16天記下7000單字

2023 最新入門零基礎 Kotlin教學【從零開始學 Kotlin 程式設計】Kotlin 教學課程目錄 (Android Kotlin, IntelliJ IDEA, Android Studio, Android APP 開發教學)

2022 最新入門零基礎 Flutter教學 【Flutter 程式設計入門實戰 30 天】Flutter 教學課程目錄 (IntelliJ IDEA 開發教學)

nano 文字編輯器

【從零開始學 Flutter 程式設計】SharedPreferences 設定檔資料存取