[FAQ] 지도/로컬 API 문의 전 꼭 읽어 주세요.
https://devtalk.kakao.com/t/faq-api/125610
안녕하세요 Fragment에서 맵을 구현후 라벨을 찍는 기능을 구현하고 있습니다.
처음 kakaoMap이 있는 Fragment 진입시에는 맵이 로드되는 속도가 빠른데 다른 Fragment 갔다가 다시 kakaoMap이 있는 Fragment 이동하면 속도가 느려지네요… onPause()에서 pause도 해보고 finish도 해봤는데도 계속 이런 에러가 생기네요 ㅠㅠ
override fun onPause() {
binding.reTownAroundMap.pause()
super.onPause()
}
답변 감사합니다. 버전은 2.9.2입니다. 지금 정확히 다중 커스텀 라벨을 찍을 때 비트맵으로 변환하는 과정에서 로드가 굉장히 느리게 되는 문제가 생깁니다.
- 데이터 호출
- 호출에 대한 데이터를 뷰에 삽입
- 뷰를 비트맵으로 변환
- 변환된 라벨을 맵에 띄어주기
아래는 코드입니다.
private fun setPetClusterLabel(petClusteringInfo: PetClusteringInfo){
val inflater = LayoutInflater.from(context) as LayoutInflater
val clusterItem = inflater.inflate(R.layout.item_clustering_pet, null)
val petCount : TextView = clusterItem.findViewById(R.id.tv_cnt)
petCount.text = petClusteringInfo.count
val bitmap = createBitmap(clusterItem)
val latLng = LatLng.from(
petClusteringInfo.latitude.toDouble(),
petClusteringInfo.longitude
)
mKakaoMapView?.labelManager?.layer?.addLabel(
LabelOptions.from(labelId, latLng)
.setStyles(
LabelStyle.from(bitmap)
.setApplyDpScale(false)
.setAnchorPoint(0.5f, 1.0f)
)
.setTag(tag)
)
}
private fun createBitmap(view: View): Bitmap {
view.measure(
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
)
view.layout(0, 0, view.measuredWidth, view.measuredHeight)
val bitmap = Bitmap.createBitmap(
view.measuredWidth, view.measuredHeight,
Bitmap.Config.ARGB_8888
)
val canvas = Canvas(bitmap)
val background = view.background
if (background != null) {
background.draw(canvas)
view.draw(canvas)
}
return bitmap
}
.
.
.
viewModel.getPetClusterSuccessValue.observe(viewLifecycleOwner) { data ->
clearLabel()
val petClusterData = data.peekContent()
for(i in petClusterData) {
setPetClusterLabel(i)
}
}
서버 호출이 느린것도 아니고 비트맵변환 과정에서의 문제인걸까요??
Label 의 이미지를 넣을 때, 비트맵을 생성 과정이 느리시다는 질문이신가요? 뷰(View)를 비트맵으로 변환하는 부분은, 지도 SDK 와는 관련이 없는 부분이라 속도 개선은 앱 쪽에서 고민해주셔야 합니다. 다만, 아래의 내용을 개발에 참고하시면 좋을 것 같습니다.
-
뷰를 비트맵으로 변환해서 → addLabel 하는 부분을 메인(UI)스레드가 아닌 다른 스레드에서 비동기로 처리합니다.
-
또는, 이미 LabelStyles 을 만들었던 기존에 있던 이미지라면, 매번 LabelStyle.from() 을 호출해서 비트맵과 라벨 스타일을 새로 생성하는 대신, 스타일의 Id 로 kakaoMap.getLabelManager().getLabelStyles(/*LabelStyles id */); 기존에 생성했던 스타일을 가져와서 사용하시면 됩니다. (지도가 종료되지 않았다는 가정입니다. 지도가 종료되고 새롭게 시작하면, 기존에 저장됐던 스타일도 초기화 됩니다)
그리고, 많은 양의 Label 을 띄우시는 것 때문에 느려지는 부분이라면 한개씩 생성하는 것보다는 addLabels() 로 여러개의 라벨을 한꺼번에 넣는 방법과 또는 LodLabel API 를 이용하시는 방법도 있습니다.