Android(Java) - 구글 맵 API (2) - 내 위치 지도 확인, 특정 위치 표시, 마커 색상 변경, 클릭 이벤트

반응형

 

프래그먼트 정적 추가

  • 지도를 처리할 활동의 레이아웃 파일에 fragment 요소 추가
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

지도 인터페이스 구현

MainActivity

  • implements OnMapReadyCallback

 

  • 메소드 추가

 

  • onMapReady : 지도를 사용할 준비가 되면 호출되는 메소드
@Override
public void onMapReady(@NonNull GoogleMap googleMap) {

}

구글 맵 기본 설정

  • MainActivity onCreate
// 구글 맵 설정
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

실행 화면

  • onMapReady 메소드에 아무런 코드를 적어주지 않아 구글 지도만 실행


내 위치 기준으로 지도 보여주기

  • onMapReady
// 내 위치 위도 경도 설정
LatLng myLocation = new LatLng( 37.5428428,  126.6772096);

// 내 위치 기준 지도 출력
googleMap.moveCamera(CameraUpdateFactory.newLatLng(myLocation));

// 내 위치 기준 지도 확대 출력, 숫자가 클수록 Zoom
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myLocation, 19));

 


특정 위치에 마커 설정하기

  • onMapReady
// 내 위치 위도 경도 설정
LatLng myLocation = new LatLng( 37.5428428,  126.6772096);

// 내 위치의 마커 설정하기
googleMap.addMarker(new MarkerOptions().position(myLocation).title("마커1"));

 


특정 위치의 마커 색상 변경하기

  • onMapReady
// 내 위치 위도 경도 설정
LatLng myLocation = new LatLng( 37.5428428,  126.6772096);

// 기본 마커 설정 (기본 색상은 빨강)
googleMap.addMarker(new MarkerOptions().position(myLocation).title("마커1"));

// 마커 색상 시안으로 변경
googleMap.addMarker(new MarkerOptions().position(new LatLng(37.5438428, 126.6772096)).title("마커2"))
        .setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN));

 


구글 맵의 지도 유형 설정하기

  • onMapReady
    • MAP_TYPE_NOMAL : 일반 지도
    • MAP_TYPE_HYBRID : 하이브리드 지도
    • MAP_TYPE_TERRAIN : 지형 지도
googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

 


마커 클릭시 이벤트 발생하기

MainActivity

  • implements GoogleMap.OnMarkerClickListener

 

  • 메소드 추가

 

마커 클릭시 메시지 출력

  • onMapReady
    • setTag(index)
googleMap.addMarker(new MarkerOptions().position(new LatLng(37.5428428, 126.6762096))
        .title("마커1")).setTag(0);

googleMap.setOnMarkerClickListener(this);

 

  • onMarkerClick
    • onMarkerClick 메소드 파라미터에 Marker 설정
    • marker.getTag() 로 인덱스 접근하여 해당 마커 클릭시 이벤트 발생
@Override
public boolean onMarkerClick(@NonNull Marker marker) {
    int index = (int) marker.getTag();

    if ( index == 0 ) {
        Toast.makeText(getApplication(), "marker click", Toast.LENGTH_LONG).show();
    }
    return false;
}

 

  • 마커 클릭시 메시지 출력


전체 소스

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback, GoogleMap.OnMarkerClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 구글 맵 설정
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    }

    // 지도를 사용할 준비가 되면 호출되는 메소드
    @Override
    public void onMapReady(@NonNull GoogleMap googleMap) {

        // 내 위치 기준 지도 출력 설정
        LatLng myLocation = new LatLng( 37.5428428,  126.6772096);
        //googleMap.moveCamera(CameraUpdateFactory.newLatLng(myLocation));

        // 내 위치 기준 지도 확대 출력 설정, 숫자가 클수록 Zoom
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myLocation, 17));

        // 내 위치의 마커 설정하기
        googleMap.addMarker(new MarkerOptions().position(myLocation).title("마커1"));

        // 마커 색상 변경
        googleMap.addMarker(new MarkerOptions().position(new LatLng(37.5438428, 126.6772096))
                .title("마커2")).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN));

        // 마커의 인덱스 설정, onMarkerClick 메소드에서 기능 정의
        googleMap.addMarker(new MarkerOptions().position(new LatLng(37.5428428, 126.6762096))
                .title("마커3")).setTag(0);

        // 지도 타입 변경
        //googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

        // onMarkerClick 메소드 호출
        googleMap.setOnMarkerClickListener(this);
    }

    // 마커 클릭시 이벤트 발생 메소드
    @Override
    public boolean onMarkerClick(@NonNull Marker marker) {
        int index = (int) marker.getTag();

        if ( index == 0 ) {
            Toast.makeText(getApplication(), "marker click", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(getApplication(), "else", Toast.LENGTH_LONG).show();
        }
        return false;
    }
}
반응형