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

2024. 12. 7. 16:21ยท๐Ÿงก Projects/๐Ÿงก Projects: App
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
'๐Ÿงก Projects/๐Ÿงก Projects: App' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ฐฉ๊ด‘๊ณก๊ณก] ์•„์ด์ฝ˜ ํด๋ฆญ์‹œ ์ „ํ™”๋ฒˆํ˜ธ, ์ฃผ์†Œ ๋ณต์‚ฌ
  • [๋ฐฉ๊ด‘๊ณก๊ณก] ์นด์นด์˜ค Map ํ˜„์žฌ ์œ„์น˜ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ๋”œ๋ ˆ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
  • [์ŠคํŒŒ๋ฅดํƒ€ ์ฝ”๋”ฉํด๋Ÿฝ] [๋กœ์ผ“๋‹จ2๊ธฐ] ์•ฑ๊ฐœ๋ฐœ Pizza Collector ๊ฐœ๋ฐœ ํ›„๊ธฐ2
  • [์ŠคํŒŒ๋ฅดํƒ€ ์ฝ”๋”ฉํด๋Ÿฝ] [๋กœ์ผ“๋‹จ2๊ธฐ] ์•ฑ๊ฐœ๋ฐœ ํ›„๊ธฐ 1
eyes from es
eyes from es
  • eyes from es
    eyes from es
    eyes from es
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
      • โค๏ธ ๊ฟ€ํŒ ๋ชจ์Œ
        • โค๏ธ ๊ฐ“์ƒ ๊ฟ€ํŒ
        • โค๏ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      • ๐Ÿงก Projects
        • ๐Ÿงก Projects: Web
        • ๐ŸŽคPreterview
        • ๐Ÿงก Projects: App
        • ๐Ÿงก๋Œ€์™ธํ™œ๋™
        • ๐Ÿงก OSCCA ์˜คํ”ˆ์†Œ์Šค ์ปจํŠธ๋ฆฌ๋ทฐ์…˜ ์•„์นด๋ฐ๋ฏธ
      • ๐Ÿ’› Frontend
        • ๐Ÿ’› Frontend : React
        • ๐Ÿ’› Frontend : JavaScript
        • ๐Ÿ’› Frontend : TypeScript
      • ๐Ÿ’š Backend
      • ๐Ÿ’™ OS: ์šด์˜์ฒด์ œ
        • ๐Ÿ’™ Linux
      • ๐Ÿ’œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
        • ๐Ÿ’œ ์ž๋ฃŒ๊ตฌ์กฐ
        • ๐Ÿ’œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
        • ๐Ÿ’œ ๋ฐฑ์ค€
        • ๐Ÿ’œSWEA
        • ๐Ÿ’œํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
      • ๐Ÿ”ด Study
        • ๐Ÿ”ด๋ฉด์ ‘ ์Šคํ„ฐ๋””
        • ๐Ÿ”ด ๊ธฐ์—…๋ถ„์„
        • ๐Ÿ”ด ์—๋Ÿฌ๋…ธํŠธ(Error Note)๐Ÿงฑ
        • ๐Ÿ”ด ITNews(Coding)
        • ๐Ÿ”ด ITNews(Tech)
      • ๐ŸŸ  ์ธ์ƒ ๊ณ„ํš
        • ๐ŸŸ  ์˜ฌํ•ด ๋ชฉํ‘œ
      • ๐ŸŸก TIL
        • ๐ŸŸก TIL ์ผ๊ธฐ
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๊ฐœ๋ฐœ๊ณต๋ถ€
    ์Šค๋งˆํŠธ์‹ฑ์Šค
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ์›น๊ฐœ๋ฐœ
    C
    ๋‰ด์Šค์Šคํฌ๋žฉ
    ๋ฐฑ์ค€
    css
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    ์ฝ”ํ…Œ
    ์ตœ๊ทผ์ด์Šˆ
    ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ
    ์ฝ”๋“œ๋ฆฌ๋ทฐ
    ์ฝ”๋”ฉ
    ์ฝ”๋“œ์Šคํ„ฐ๋””
    Ai
    ์ž๋ฃŒ๊ตฌ์กฐ
    IT์ด์Šˆ
    ๋ฌธ์ œํ’€์ด
    ๋‰ด์Šค๋ฃธ
    html
    ์Šคํ„ฐ๋””
    ์‚ผ์„ฑ์ „์ž
    ๋ถ„์„๋ ˆํฌํŠธ
    ๋™ํ–ฅ๋ถ„์„
    ๋„ค์นด๋ผ์ฟ ๋ฐฐ
    ๊ฐœ๋ฐœ
    ๋ฐฉํ•™์Šคํ„ฐ๋””
    ๊ธฐ์—…๋ถ„์„
    SW์ด์Šˆ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
eyes from es
[๋ฐฉ๊ด‘๊ณก๊ณก] ์ง€๋„ ๋ ˆ์ด๋ธ” ํด๋ฆญ์‹œ ์•„์ด์ฝ˜ ๋ณ€๊ฒฝ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”