๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿงก Projects/๐Ÿงก Projects: App

[๋ฐฉ๊ด‘๊ณก๊ณก] ์ง€๋„ ๋ ˆ์ด๋ธ” ํด๋ฆญ์‹œ ์•„์ด์ฝ˜ ๋ณ€๊ฒฝ

by eyes from es 2024. 12. 7.
728x90
๋ฐ˜์‘ํ˜•

1๏ธโƒฃ  ์˜๋„

1. firebase์—์„œ ๊ฐ€์ ธ์˜จ ์œ„์น˜๋ฅผ for๋ฌธ์„ ๋Œ๋ฉด์„œ ์ง€๋„ ์œ„์— label์„ ํ‘œ์‹œํ•œ๋‹ค.

2. ๊ฐ ์ง€๋„ ๋ ˆ์ด๋ธ”์— ํด๋ฆญ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋ถ™ํ˜€์„œ 

3. A ๋ ˆ์ด๋ธ” ํด๋ฆญ

      ํด๋ฆญ๋œ ์ง€๋„ ๋ ˆ์ด๋ธ” ⇒  aim_icon ์œผ๋กœ ๋ณ€๊ฒฝ

4. B ๋ ˆ์ด๋ธ” ํด๋ฆญ ์‹œ, 

      A ๋ ˆ์ด๋ธ” ⇒ ์›๋ž˜ ์•„์ด์ฝ˜, B ๋ ˆ์ด๋ธ” ⇒  aim_icon์œผ๋กœ ๋ณ€๊ฒฝ

 

2๏ธโƒฃ ๋ฌธ์ œ ์ƒํ™ฉ

์˜๋„ 3๋ฒˆ์—์„œ ์•„์˜ˆ ํด๋ฆญํ•œ ๋ ˆ์ด๋ธ”์˜ ์•„์ด์ฝ˜ ๋ณ€๊ฒฝ X, ๋‹ค๋ฅธ ํด๋ฆญ ๋ฆฌ์Šค๋„ˆ๋Š” ์ž‘๋™

 

 

3๏ธโƒฃ ์‹œ๋„ ๋ฐฉ๋ฒ•

label.setStyles(newStyle)

 

๋”๋ณด๊ธฐ

์ „์ฒด ์ฝ”๋“œ

class MapManager(private val context: Context) {

    // ์ด์ „์— ํด๋ฆญ๋œ ํ™”์žฅ์‹ค์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜
    private var lastClickedToilet: Label? = null
    private val locationHelper by lazy { LocationHelper(context) }

    // ์ง€๋„ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜
    suspend fun initializeMapView(): Boolean {
        val isSuccess = CompletableDeferred<Boolean>()

        withContext(Dispatchers.Main) { // UI ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰
            mapView = (context as NearActivity).findViewById(R.id.map_view)
            mapView.start(object : MapLifeCycleCallback() {
                override fun onMapDestroy() {
                    Log.d("MapManager", "MapView destroyed")
                }

                override fun onMapError(error: Exception) {
                    Log.e("MapManager", "Map error: ${error.message}")
                    isSuccess.completeExceptionally(error)
                }
            }, object : KakaoMapReadyCallback() {
                override fun onMapReady(map: KakaoMap) {
                    kakaoMap = map
                    Log.d("MapManager", "KakaoMap is ready")
                    setupMapClickListener()
                    isSuccess.complete(true)
                }
            })
        }

        return isSuccess.await()
    }


    /**
     * ์ง€๋„ ํด๋ฆญ ๋ฆฌ์Šค๋„ˆ ์„ค์ • ํ•จ์ˆ˜
     */

    private fun setupMapClickListener() {
        kakaoMap.setOnLabelClickListener { _, _, clickedLabel ->
            val toilet = labelToToiletMap[clickedLabel]
            if (toilet != null) {
                // ์ด์ „์— ํด๋ฆญ๋œ ํ™”์žฅ์‹ค์˜ ๋ ˆ์ด๋ธ”์„ ์›๋ž˜ ์ƒํƒœ๋กœ ๋ณต์›
                lastClickedToilet?.let {
                    Log.d("์ง€๋„ ํด๋ฆญ", it.toString())
                    restoreLabelToOriginal(it)
                }

                // ํด๋ฆญ๋œ ๋งˆ์ปค๋ฅผ ๋กœ๊ณ ๋กœ ๋ณ€๊ฒฝ
                changeLabelToClicked(clickedLabel)

                //BottomSheet ์ดˆ๊ธฐํ™”
                val activity = context as NearActivity
                activity.bottomSheetHelper.initializeBottomSheet(toilet)
                true
            } else {
                false
            }
        }
    }

    // ํด๋ฆญ๋œ ๋งˆ์ปค๋ฅผ ๋กœ๊ณ ๋กœ ๋ณ€๊ฒฝ
    private fun changeLabelToClicked(label: Label) {
        lastClickedToilet = label
        val newStyles = kakaoMap.labelManager?.addLabelStyles(
            LabelStyles.from(
                LabelStyle.from(R.drawable.aim_icon).setZoomLevel(currentZoo)
            )
        )
        label.changeStyles(newStyles)
        Log.d("MapManager", "Label changed to clicked style")
    }

    // ๋งˆ์ปค๋ฅผ ์›๋ž˜ ์Šคํƒ€์ผ๋กœ ๋ณต์›
    private fun restoreLabelToOriginal(label : Label) {
        val originalStyles = kakaoMap.labelManager?.addLabelStyles(
            LabelStyles.from(
                LabelStyle.from(R.drawable.map_pin1).setZoomLevel(10),
                LabelStyle.from(R.drawable.map_pin2).setZoomLevel(13),
                LabelStyle.from(R.drawable.map_pin3).setZoomLevel(16),
                LabelStyle.from(R.drawable.map_pin4).setZoomLevel(19)
            )
        )

        // ๋ ˆ์ด๋ธ”์ด ํด๋ฆญ๋œ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ ˆ์ด๋ธ”์„ ์›๋ž˜ ์Šคํƒ€์ผ๋กœ ๋ณต์›
        label.changeStyles(originalStyles)
        Log.d("MapManager", "Label restored to original")
    }
}

1. ๊ฐ label ๋งˆ๋‹ค setupClickListenr()

2. setupClickListener()

    lastClickListener (์ด์ „์— ๋ˆŒ๋ฆฐ ๋ ˆ์ด๋ธ”) ์ด ์žˆ๋‹ค๋ฉด restoreLabelToOriginal

    ์ด๋ฒˆ์— ๋ˆŒ๋ฆฐ ๋ ˆ์ด๋ธ” aim_icon์œผ๋กœ ๋ณ€๊ฒฝ changeLabelToClicked

 

4๏ธโƒฃ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• 

setStyles -> changeStyles

  private fun changeLabelToClicked(label: Label) {
        lastClickedToilet = label
        val newStyles = kakaoMap.labelManager?.addLabelStyles(
            LabelStyles.from(
                LabelStyle.from(R.drawable.aim_icon)
            )
        )
        label.changeStyles(newStyles)
        Log.d("MapManager", "Label changed to clicked style")
    }

 

 

5๏ธโƒฃ  ์™œ setStyles ๋Š” ์•ˆ๋ผ?

kakaoMap API ์ฐธ๊ณ _ Android Label_changeStyles

https://apis.map.kakao.com/android_v2/docs/api-guide/label/label/

 

 

์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์—์„œ label. ์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์ด๋ ‡๊ฒŒ styles ๋ณ€๊ฒฝ ๊ด€๋ จ ๋ฉ”์„œ๋“œ๊ฐ€ ๋œฌ๋‹ค. ๋‚˜๋Š” label๋กœ ์ ‘๊ทผํ•˜๋ ค๋‹ˆ 

2๋ฒˆ, 3๋ฒˆ์ธ๋ฐ

6๏ธโƒฃ setStyles vs changeStyles

1. setStyles

  • ๊ธฐ์กด ์Šคํƒ€์ผ์„ ์™„์ „ํžˆ ๋ฎ์–ด์”Œ์šฐ๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœ ์‹œ, ํ•ด๋‹น Label์˜ ๊ธฐ์กด ์Šคํƒ€์ผ๋“ค์ด ๋ชจ๋‘ ์ œ๊ฑฐ๋˜๊ณ  ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ๋กœ ๊ต์ฒด๋ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ ์ดˆ๊ธฐ ์„ค์ •์ด๋‚˜ ์™„์ „ํ•œ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2. changeStyles

  • ๊ธฐ์กด ์Šคํƒ€์ผ +  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ๋ฐ˜์˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๊ธฐ์กด ์Šคํƒ€์ผ์„ ์ผ๋ถ€ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

7๏ธโƒฃ vararg ?

1. vararg (Variable Arguments)

  • vararg ํ‚ค์›Œ๋“œ๋Š” ๊ฐ€๋ณ€ ์ธ์ˆ˜(variable arguments)๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, ๋ฐฐ์—ด๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
fun applyStyles(vararg styles: LabelStyle) {
    for (style in styles) {
        println(style)
    }
}

// ํ˜ธ์ถœ ๋ฐฉ๋ฒ•
applyStyles(style1, style2, style3) // ๊ฐœ๋ณ„ ๊ฐ’ ์ „๋‹ฌ
applyStyles(*arrayOf(style1, style2, style3)) // ๋ฐฐ์—ด ์ „๋‹ฌ
  • ํ˜ธ์ถœ ์‹œ ๊ฐ€๋ณ€ ์ธ์ˆ˜๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ LabelStyle์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ *(์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ํ’€์–ด์„œ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. styles (์ผ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ)

  • styles๊ฐ€ ๋‹จ์ˆœํžˆ ์ผ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ •์˜๋˜์—ˆ๋‹ค๋ฉด, ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋งŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • vararg์ฒ˜๋Ÿผ ๊ฐœ๋ณ„์ ์ธ ๊ฐ’๋“ค์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
fun applyStyles(styles: Array<LabelStyle>) {
    for (style in styles) {
        println(style)
    }
}

// ํ˜ธ์ถœ ๋ฐฉ๋ฒ•
applyStyles(arrayOf(style1, style2, style3)) // ๋ฐฐ์—ด๋กœ๋งŒ ์ „๋‹ฌ ๊ฐ€๋Šฅ

์ฐจ์ด์  ์š”์•ฝ

                                   vararg                                                                                            styles (์ผ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ)

์ธ์ˆ˜ ์ „๋‹ฌ ๋ฐฉ์‹ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ๋ฐฐ์—ด ์ „๋‹ฌ ๊ฐ€๋Šฅ ๋ฐ˜๋“œ์‹œ ๋ฐฐ์—ด๋กœ๋งŒ ์ „๋‹ฌ ๊ฐ€๋Šฅ
์‚ฌ์šฉ์˜ ์œ ์—ฐ์„ฑ ๋” ์œ ์—ฐํ•จ (๊ฐœ๋ณ„ ๊ฐ’ ๋˜๋Š” ๋ฐฐ์—ด) ๋œ ์œ ์—ฐํ•จ
ํ˜ธ์ถœ ์‹œ ํŽธ์˜์„ฑ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž(*)๋กœ ๋ฐฐ์—ด ํ’€๊ธฐ ๊ฐ€๋Šฅ ๋ณ„๋„์˜ ์ž‘์—… ์—†์ด ๋ฐฐ์—ด๋กœ ์ „๋‹ฌ

 

 

728x90
๋ฐ˜์‘ํ˜•