[Andorid] 산책 앱 개발 일지 3: 구글 맵에 동선 그리기

클로이·2022년 1월 6일
0

폴리라인을 MutableList로 선언

  • LatLng을 가지고 있는 Polyline 객체를, 수정 가능한 List인 MutableList로 선언해요
  • typealias 을 사용하여 존재하는 타입의 새로운 이름 또는 별칭을 만들어 줬어요.
  • 만들어진 Polylines룰 UI에서 관찰한 pathPoints로 생성했어요.

TrackingService.kt

typealias Polyline = MutableList<LatLng>
typealias Polylines = MutableList<Polyline>

class TrackingService: LifecycleService() {

    //...

    companion object {
        //...
        val pathPoints = MutableLiveData<Polylines>()
    }

    private fun postInitialValues() {
        //...
        pathPoints.postValue(mutableListOf())
    }

MutableList에 움직이는 위치 담기

  • 서비스가 시작될 때 pathPoints를 빈 객체로 초기화해요.
  • 사용자의 위치를 추적 할 때 pathPoints에 위치를 차곡 차곡 담을 거에요.

TrackingService.kt

    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()
        
        //...
    }

pathPoints 관찰하여 동선을 그리고 카메라를 움직임

  • LatLng을 가진 pathPoints 리스트를 생성하여 사용자가 움직이는 위치를 따라 카메라를 움직이며 폴리라인을 그려요.

TrackingFragment.kt

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

0개의 댓글