0Pricing
Android Academy · 강의

마커와 카메라

마커를 배치하고 카메라를 이동합니다.

마커와 카메라은(는) CoddyKit의 무료 Android Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Android Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Android Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

지도에 표시하기

빈 지도는 타일에 불과합니다. 마커를 추가하면 상점, 식당, 사용자 목적지 등을 정보로 표시할 수 있습니다. 또한 카메라를 이동하여 필요한 위치를 화면에 보여줄 수 있습니다.

이 수업에서는 마커를 추가하고 맞춤 설정하며, 여러 마커를 군집으로 묶고, 장소 사이에서 카메라를 부드럽게 애니메이션으로 이동합니다.

마커 추가하기

maps-compose에서는 GoogleMap의 콘텐츠 람다 안에 배치하는 컴포저블로 마커를 추가합니다. 각 Marker는 위치를 담은 MarkerState를 받습니다.

import com.google.maps.android.compose.Marker
import com.google.maps.android.compose.rememberMarkerState

@Composable
fun MapWithMarker() {
    val position = LatLng(37.7749, -122.4194)
    GoogleMap(modifier = Modifier.fillMaxSize()) {
        Marker(
            state = rememberMarkerState(position = position),
            title = "San Francisco",
            snippet = "Welcome to SF"
        )
    }
}

제목, 스니펫, 정보 창

사용자가 마커를 탭하면 기본 정보 창에 title과 snippet이 표시됩니다. 탭하면 제목이 굵게 표시되고 그 아래에 스니펫이 나타납니다.

완전히 직접 제어하려면 원하는 컴포저블 콘텐츠를 담은 MarkerInfoWindow를 제공할 수 있습니다.

Marker(
    state = rememberMarkerState(position = LatLng(48.8584, 2.2945)),
    title = "Eiffel Tower",
    snippet = "Paris, France",
    // The info window pops up on tap by default
)

마커 아이콘 맞춤 설정

icon 매개변수를 통해 BitmapDescriptor를 전달하면 마커의 모양을 변경할 수 있습니다. defaultMarker(hue)는 기본 핀의 색상을 바꾸며, drawable에서 직접 만들 수도 있습니다.

import com.google.android.gms.maps.model.BitmapDescriptorFactory

Marker(
    state = rememberMarkerState(position = LatLng(35.6895, 139.6917)),
    title = "Tokyo",
    icon = BitmapDescriptorFactory.defaultMarker(
        BitmapDescriptorFactory.HUE_AZURE
    )
)

데이터에서 여러 마커 만들기

실제 앱에서는 목록에서 마커를 렌더링합니다. 지도 콘텐츠 안에서 데이터를 반복 처리하고 각 항목에 대해 Marker를 생성하세요. 항목마다 변하지 않는 키를 사용합니다.

data class Place(val name: String, val latLng: LatLng)

@Composable
fun PlacesMap(places: List<Place>) {
    GoogleMap(modifier = Modifier.fillMaxSize()) {
        places.forEach { place ->
            Marker(
                state = rememberMarkerState(position = place.latLng),
                title = place.name
            )
        }
    }
}

마커 클릭 처리하기

각 Marker는 onClick 람다를 받습니다. 이벤트를 소비하여 기본 정보 창이 표시되지 않게 하려면 true를 반환하고, 기본 동작을 실행하려면 false를 반환하세요.

Marker(
    state = rememberMarkerState(position = LatLng(40.7128, -74.0060)),
    title = "New York",
    onClick = {
        // handle the tap, e.g. open a detail screen
        true // consume the event
    }
)

카메라 즉시 이동하기

애니메이션 없이 화면 영역을 즉시 이동하려면 CameraPositionState에서 카메라 위치를 직접 설정하세요. 이는 지도 화면이 순간적으로 바뀌는 방식입니다.

val cameraPositionState = rememberCameraPositionState()

// Instant move
cameraPositionState.position = CameraPosition.fromLatLngZoom(
    LatLng(51.5074, -0.1278), // London
    14f
)

카메라에 애니메이션 적용하기

완성도 높은 느낌을 주려면 animate()로 카메라에 애니메이션을 적용하세요. 일시 중단 호출이므로 코루틴 스코프에서 실행해야 합니다. 목표 위치는 CameraUpdate로 지정합니다.

import com.google.android.gms.maps.CameraUpdateFactory

val scope = rememberCoroutineScope()
Button(onClick = {
    scope.launch {
        cameraPositionState.animate(
            CameraUpdateFactory.newLatLngZoom(
                LatLng(48.8566, 2.3522), 13f
            ),
            durationMs = 1000
        )
    }
}) { Text("Fly to Paris") }

여러 마커에 맞게 화면 조정하기

여러 마커를 한 번에 표시하려면 모든 마커를 포함하는 LatLngBounds를 만든 다음, 픽셀 단위 여백과 함께 newLatLngBounds로 해당 영역을 향해 애니메이션을 실행하세요.

import com.google.android.gms.maps.model.LatLngBounds

val bounds = LatLngBounds.Builder().apply {
    places.forEach { include(it.latLng) }
}.build()

scope.launch {
    cameraPositionState.animate(
        CameraUpdateFactory.newLatLngBounds(bounds, 100) // 100px padding
    )
}

많은 마커 군집화하기

수백 개의 마커는 지도를 복잡하게 만듭니다. maps-compose-utils 라이브러리는 주변 마커를 하나의 말풍선으로 묶는 Clustering을 제공합니다. 지도를 확대하면 말풍선이 다시 나뉩니다.

import com.google.maps.android.compose.clustering.Clustering

@Composable
fun ClusteredMap(items: List<MyClusterItem>) {
    GoogleMap(modifier = Modifier.fillMaxSize()) {
        Clustering(items = items)
    }
}

카메라 상태 읽기

카메라 상태를 읽을 수도 있습니다. cameraPositionState.position은 현재 대상 위치와 확대 배율을 제공하고, isMoving은 사용자가 현재 지도를 이동하고 있는지 알려줍니다. 이를 활용하면 현재 보이는 영역의 데이터만 지연 로드할 수 있습니다.

LaunchedEffect(cameraPositionState.isMoving) {
    if (!cameraPositionState.isMoving) {
        val center = cameraPositionState.position.target
        // fetch data near `center`
    }
}

빠른 확인

카메라를 순간 이동시키는 대신 1초 동안 새 위치로 부드럽게 이동하게 하려면 어떻게 해야 할까요?

복습

이제 지도에 풍부하고 동적인 정보를 표시할 수 있습니다.

  • GoogleMap 콘텐츠 안에 Marker 컴포저블을 배치하고 title, snippet, 맞춤 icon을 설정합니다.
  • 데이터 목록에서 마커를 렌더링하고 onClick을 처리합니다.
  • position으로 카메라를 즉시 이동하거나 animate()로 부드럽게 이동합니다.
  • LatLngBounds로 여러 지점에 맞게 화면을 조정하고 Clustering으로 복잡함을 줄입니다.

다음으로는 실제 기기에서 모든 기능이 작동하도록 올바른 방법으로 위치 권한을 요청합니다.

자주 묻는 질문

“마커와 카메라” 강의는 무료인가요?

네 — “마커와 카메라” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Android Academy 강의 전체를 잠금 해제할 수 있습니다. Android Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“마커와 카메라”에서 뭘 배우나요?

마커를 배치하고 카메라를 이동합니다. 브라우저에서 직접 실행하는 실습 코드로 Android Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Android Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Android Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“마커와 카메라” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Android Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Android Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 지도 표시
  2. 사용자 위치 가져오기
  3. 마커와 카메라
  4. 올바른 위치 권한 처리
← Android Academy(으)로 돌아가기