티스토리 뷰

728x90

안녕하세요 지난시간에 구글맵 API키를 등록하여 지도를 띄워보고 다음으로는 마커를 생성하고 마커클릭시 나타나는 정보창을 커스텀화하는 방법 그다음으로 현재 내위치를 따라다니면서 마커를 생성하는 방법에 대해 알아보았습니다. 이번에는 사용자가 구글지도를 조작하는 이벤트를 감지하여 이에따른 처리를 해주는 방법에 대해 알아보겠습니다.

 

바로 이전에 현재 내위치를 따라 마커를 생성하는 방법에서 일정시간마다 마커를 생성하고 지도를 내위치를 중심으로 움직이게 하였는데요. 이렇게 할 경우 사용자가 지도의 다른 위치를 보고 싶어도 계속해서 내위치로 돌아오기 때문에 이용에 불편함이 있습니다. 따라서 사용자가 지도를 조작하였을 때 이벤트를 감지하여 내위치를 중심으로 지도가 돌아오지 않도록 하는 기능을 구현해보겠습니다.

 

일정시간마다 현재위치를 구하고 마커를 생성한 후 지도를 내위치를 중심으로 옮기는것은 지난 포스팅에서 다뤘으므로 생략하도록 하겠습니다.

 

사용자의 지도조작을 감지하기 위해서는 구글맵 API에 있는 OnCameraMoveListener를 사용하여야합니다. 구글맵 인스턴스의 setOnCameraMoveListener메소드의 매개변수로 OnCameraMoveListener인스턴스를 넘겨주면 사용자가 지도를 조작하여 지도가 움직일때마다 이벤트를 감지할 수 있습니다. 단 주의할점은 이 이벤트 리스너는 한번의 터치를 하나의 이벤트로 감지하지 않습니다. 한번 터치한채로 계속해서 지도를 움직이면 해당 이벤트는 지속적으로 발생합니다. 만약 한번의 터치마다 한번 동작하는 어떤 기능을 구현하고 싶으신 분은 다른 방법을 사용하여야합니다. 여기에 대해선 다음에 알아보도록 하겠습니다.

 

오버라이딩한 onMapReady메소드에서 구글맵 인스턴스에 이벤트리스너를 등록하겠습니다.

 

        mMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
            @Override
            public void onCameraMove() {
                cameraIdle = true;
            }
        });

코드는 아주 간단합니다. 위에서 설명한대로 인스턴스를 매개변수로 넘겨주고 onCameraMove메소드를 오버라이드 해주면 됩니다. 저는 여기서 해당 액티비티의 멤버변수인 boolean변수를 true값으로 만들어 주었습니다. cameraIdle이 true일경우 사용자가 지도를 조작했다는 뜻이되고 true일때는 지도를 내위치 중심으로 옮기지 않으면 되겠죠.

그럼 그다음으로 내위치를 중심으로 지도를 옮기는 코드부분을 수정해보겠습니다.

 

        TimerTask poolGPSLocationTask = new TimerTask() {
            @Override
            public void run() {
                DriveActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        gpsManager.getLocation();
                        if (mMap != null) {
                            if (myLocationMarker == null) {
                                locationMarkerOption = new MarkerOptions();
                                locationMarkerOption.position(new LatLng(gpsManager.getLatitude(), gpsManager.getLongitude()));
                                myLocationMarker = mMap.addMarker(locationMarkerOption);
                                mMap.moveCamera(CameraUpdateFactory.newLatLng(myLocationMarker.getPosition()));
                                mMap.animateCamera(CameraUpdateFactory.zoomTo(14));
                            } else {
                                myLocationMarker.setPosition(new LatLng(gpsManager.getLatitude(), gpsManager.getLongitude()));
                                if(cameraIdle == true)
                                    cameraIdle = false;
                                else
                                    mMap.moveCamera(CameraUpdateFactory.newLatLng(myLocationMarker.getPosition()));
                                Log.d("location_test", "location = " + gpsManager.getLatitude() + " , " + gpsManager.getLongitude());
                            }
                        }
//                        Toast.makeText(DriveActivity.this, gpsManager.getLatitude() + "," + gpsManager.getLongitude(), Toast.LENGTH_SHORT).show();순서에 따라
                    }
                });
            }
        };

일정시간마다 지도를 업데이트하는 코드입니다. cameraIdle이 true일때는 지도를 움직이지 않고 해당 boolean값을 false바꿔주기만 합니다. 그다음 업데이트가 이루어지는 사이의 시간동안 사용자의 지도조작이 없었다면 cameraIdle은 여전히 false가 되고 이때는 지도를 내위치가 중심에 오도록 지도를 움직여줍니다.

 

해보시고 안되시거나 궁금한점이 있으신분은 댓글 남겨주시고 적극적으로 답변 드리도록 하겠습니다.

도움이 되셨다면 좋아요 한번 부탁드립니다. 감사합니다.

댓글