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 (์ผ๋ฐ ํ๋ผ๋ฏธํฐ)
์ธ์ ์ ๋ฌ ๋ฐฉ์ | ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ๊ฐ๋ณ์ ์ผ๋ก ์ ๋ฌํ๊ฑฐ๋ ๋ฐฐ์ด ์ ๋ฌ ๊ฐ๋ฅ | ๋ฐ๋์ ๋ฐฐ์ด๋ก๋ง ์ ๋ฌ ๊ฐ๋ฅ |
์ฌ์ฉ์ ์ ์ฐ์ฑ | ๋ ์ ์ฐํจ (๊ฐ๋ณ ๊ฐ ๋๋ ๋ฐฐ์ด) | ๋ ์ ์ฐํจ |
ํธ์ถ ์ ํธ์์ฑ | ์คํ๋ ๋ ์ฐ์ฐ์(*)๋ก ๋ฐฐ์ด ํ๊ธฐ ๊ฐ๋ฅ | ๋ณ๋์ ์์ ์์ด ๋ฐฐ์ด๋ก ์ ๋ฌ |