본 글은 [깡쌤의 안드로이드 프로그래밍 with 자바 - 2022 - 쌤즈] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책 혹은 인강(www.ssamz.com)을 통해 확인해 주세요.
15.3.2. 지도 제어
앞서 배운 것처럼 AndroidManifest.xml 설정과 레이아웃 XML 파일의 <fragment> 태그로
지도 화면을 출력할 수 있습니다. 하지만 세계지도의 일부분만 보이는 형태로 출력됩니다. 화면에
지도가 정상으로 보인다면 가장 기본으로 제어해야 할 사항은 지도의 중심이 특정 위치로 보이게
해주는 작업입니다. 이를 위해서는 우선 자바 코드에서 지도 객체를 얻어야 합니다. play-services
라이브러리에서 지도는 GoogleMap 객체로 표현되는데, 이 객체는 이벤트 모델로 얻습니다.
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback{
GoogleMap map;
@Override
protected void onCreate(Bundle savedInstanceState) {
//...
((SupportMapFragment) getSupportFragmentManager().
findFragmentById(R.id.lab1_map)).getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
map=googleMap;
}
}
지도 객체를 얻으려면 OnMapReadyCallback 인터페이스를 구현한 클래스를 getMapAsync ()
함수를 이용하여 등록해야 합니다. 이렇게 해놓으면 지도 객체를 사용할 수 있을 때 onMapReady()
함수가 자동으로 호출되면서 매개변수로 GoogleMap 객체가 전달됩니다.
GoogleMap 객체를 얻었다면 이제 GoogleMap을 이용하여 지도를 제어해야 하는데요. 가장
기본적인 제어가 지도의 중심 위치 이동입니다. 사용자의 현재 위치나 회사 위치 등 특정 위치를 지도의
중심에 보여주어야 합니다.
LatLng latLng = new LatLng(37.566643, 126.978279);
CameraPosition position = new CameraPosition.Builder()
.target(latLng).zoom(16f).build();
map.moveCamera(CameraUpdateFactory.newCameraPosition(position));
지도 내에서 특정 위치는 LatLng 객체로 표현됩니다. LatLng 객체를 생성하면서 매개변수로 위도와
경도를 줍니다. CameraPosition 클래스는 지도가 화면에 출력되기 위한 정보를 가지는 클래스로
지도의 중심 위치를 target () 함수로, 지도의 확대 수준을 zoom() 함수로 지정합니다. 이렇게 만들어진
CameraPosition을 GoogleMap의 moveCarmera() 함수의 매개변수로 지정하면 CameraPosition
정보대로 지도에 표시됩니다. 위의 코드는 LatLng 객체가 표현하는 위치에 확대 수준 16의 지도를
화면에 출력합니다.
특정 위치를 중심으로 지도 화면이 출력된 다음 발생하는 다양한 사용자 이벤트 프로그램이 필요할 수
있습니다. 사용자가 지도를 손으로 밀어 위치를 변경하거나 확대 레벨을 변경하는 순간의 이벤트를
처리할 수 있습니다.
- OnMapClickListener: 지도의 특정 위치를 클릭
- OnMapLongClickListener: 지도의 특정 위치를 롱클릭
- OnCameraMoveListener: 지도의 중심 위치가 변경되거나 확대 수준이 변경
- OnCameraIdleListener: 지도의 중심 위치, 확대 수준 변경이 완료된 순간
OnMapClickListener 이벤트와 OnMapLongClickListener 이벤트로 사용자의 지도 클릭, 롱클릭
이벤트를 처리할 수 있으며, 클릭한 지점의 위경도 값을 얻을 수 있습니다. OnCameraMoveListener
이벤트는 사용자가 지도의 중심을 이동하거나 확대 수준을 변경하는 순간의 이벤트이며, 변경하는
순간 빈번하게 이벤트 콜백 함수가 호출되어 그 순간의 중심 위치 및 확대 수준을 콜백 함수로 얻을 수
있습니다. OnCameraIdleListener는 지도 변경 이벤트가 끝난 순간 한 번 호출되는 이벤트입니다
map.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
//...
}
});
map.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) {
//...
}
});
map.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
@Override
public void onCameraMove() {
int zoom=(int)map.getCameraPosition().zoom;
String center=map.getCameraPosition().target.latitude+":"+
map.getCameraPosition().target.longitude;
//...
}
});
map.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
@Override
public void onCameraIdle() {
int zoom=(int)map.getCameraPosition().zoom;
String center=map.getCameraPosition().target.latitude+":"+
map.getCameraPosition().target.longitude;
//...
}
});
마커 보이기
사용자의 현재 위치나 회사의 위치 등 특정 위치에 아이콘 이미지를 보여야 할 때가 있는데요. 이처럼
위치를 나타낼 때 지도에 표시되는 이미지를 마커(Marker)라고 부릅니다. 마커는 개발자가 준비한
임의의 아이콘 이미지일 수도 있고 동적으로 그려진 이미지일 수도 있습니다.
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_marker));
markerOptions.position(latLng);
markerOptions.title("서울시청");
markerOptions.snippet("Tel:02-120");
마커에 대한 정보는 MarkerOptions 객체로 표현합니다. MarkerOption에 icon () 함수를 이용하여
마커로 사용할 이미지를 지정하며, position ( ) 함수로 마커가 추가될 위치를 지정합니다. 또한
마커를 사용자가 클릭했을 때 풍선 도움말 형태의 정보 창을 자동으로 보여줄 수 있는데, 정보 창에
표시할 정보를 title () 함수와, snippet () 함수로 지정합니다. 이렇게 마커에 대한 정보를 가지는
MarkerOption 객체를 준비한 후 addMarker() 함수로 지도 위에 마커를 출력하면 됩니다.
map.addMarker(markerOptions);
마커 이벤트 처리
사용자가 지도에 출력된 마커를 클릭한 순간의 이벤트나 마커의 정보 창을 클릭했을 때의 이벤트 처리가
필요할 수 있습니다.
- OnMarkerClickListener: 마커를 클릭한 순간의 이벤트
- OnInfoWindowClickListener: 마커의 정보 창을 클릭한 순간의 이벤트
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
if(marker==marker1){
//...
}
return false;
}
});
map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
//...
}
});
setOnMarkerClickListener와 setOnInfoWindowClickListener 함수를 이용하여 이벤트를
등록하며, 이벤트 발생 시 호출되는 함수의 매개변수로 Marker 객체가 전달되어 마커 내의 정보를 얻어
처리할 수 있습니다.
'Android' 카테고리의 다른 글
Multiple File upload, download with retrofit, Glide, spring boot (0) | 2022.07.25 |
---|---|
Android – Spring Boot Network Programming with Retrofit (0) | 2022.07.21 |
[깡쌤의 안드로이드 프로그래밍 with 자바 - 2022 - 쌤즈] 정리 24 - Retrofit2 구조 (0) | 2022.05.09 |
[깡쌤의 안드로이드 프로그래밍 with 자바 - 2022 - 쌤즈] 정리 23 - 파일 읽고 쓰기 (0) | 2022.05.09 |
[깡쌤의 안드로이드 프로그래밍 with 자바 - 2022 - 쌤즈] 정리 22 - 카메라 앱 연동, FileProvider (0) | 2022.05.09 |