LatLng
을 가지고 있는 Polyline
객체를, 수정 가능한 List인 MutableList
로 선언해요typealias
을 사용하여 존재하는 타입의 새로운 이름 또는 별칭을 만들어 줬어요.Polylines
룰 UI에서 관찰한 pathPoints
로 생성했어요.typealias Polyline = MutableList<LatLng>
typealias Polylines = MutableList<Polyline>
class TrackingService: LifecycleService() {
//...
companion object {
//...
val pathPoints = MutableLiveData<Polylines>()
}
private fun postInitialValues() {
//...
pathPoints.postValue(mutableListOf())
}
pathPoints
를 빈 객체로 초기화해요.pathPoints
에 위치를 차곡 차곡 담을 거에요. private fun addEmptyPolyline() = pathPoints.value?.apply {
add(mutableListOf())
pathPoints.postValue(this)
} ?: pathPoints.postValue(mutableListOf(mutableListOf()))
private fun addPathPoint(location: Location?) {
location?.let {
val position = LatLng(location.latitude, location.longitude)
pathPoints.value?.apply {
last().add(position)
pathPoints.postValue(this)
}
}
}
val locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
super.onLocationResult(locationResult)
if (isTracking.value!!) {
locationResult?.locations?.let {
for (location in it) {
addPathPoint(location)
}
}
}
}
}
//...
private fun startForegroundService() {
addEmptyPolyline()
//...
}
LatLng
을 가진 pathPoints
리스트를 생성하여 사용자가 움직이는 위치를 따라 카메라를 움직이며 폴리라인을 그려요.private var pathPoints = mutableListOf<Polyline>()
//...
private fun subscribeToObservers() {
//...
TrackingService.pathPoints.observe(viewLifecycleOwner, {
pathPoints = it
addLatestPolyline()
moveCameraToUser()
})
}
//...
private fun moveCameraToUser() {
if(pathPoints.isNotEmpty() && pathPoints.last().isNotEmpty()) {
map?.animateCamera(
CameraUpdateFactory.newLatLngZoom(
pathPoints.last().last(),
MAP_ZOOM
)
)
}
}
private fun addLatestPolyline() {
if(pathPoints.isNotEmpty() && pathPoints.last().size > 1) {
val preLastLatLng = pathPoints.last()[pathPoints.last().size - 2]
val lastLatLng = pathPoints.last().last()
val polylineOptions = PolylineOptions()
.color(POLYLINE_COLOR)
.width(POLYLINE_WIDTH)
.add(preLastLatLng)
.add(lastLatLng)
map?.addPolyline(polylineOptions)
}
}
경로 및 영역을 나타내는 다중선 및 다각형
코틀린(Kotlin) 클래스(Class) : 타입 별명 (Type aliases)
[Android-Kotlin] 코틀린 Collection 함수
[Kotlin] MutableList 기능 설명
[스트림 연습] Kotlin Collection Example
Drawing the Running Track on the Map - MVVM Running Tracker App - Part 14