728x90
네이버 지도를 띄워 마커를 띄우는 것까지 완료했다면 그다음은 커스텀 마커를 생성해보고 해당 마커에 클릭 이벤트를 추가해보겠습니다.
.XML 입니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".NaverCustomMarkerActivity">
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.naver.maps.map.MapFragment" />
<com.naver.maps.map.widget.LocationButtonView
android:id="@+id/location"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
/>
<com.naver.maps.map.widget.ZoomControlView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/zoom"
android:layout_below="@id/location"
android:layout_alignParentRight="true"
/>
<com.naver.maps.map.widget.CompassView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:id="@+id/compass"
android:layout_below="@id/zoom"/>
<com.naver.maps.map.widget.ScaleBarView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/scalebar"
android:layout_below="@id/compass"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
Activity 입니다.
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.FragmentManager;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.Toast;
import com.naver.maps.geometry.LatLng;
import com.naver.maps.map.LocationTrackingMode;
import com.naver.maps.map.MapFragment;
import com.naver.maps.map.NaverMap;
import com.naver.maps.map.OnMapReadyCallback;
import com.naver.maps.map.UiSettings;
import com.naver.maps.map.overlay.Marker;
import com.naver.maps.map.overlay.Overlay;
import com.naver.maps.map.overlay.OverlayImage;
import com.naver.maps.map.util.FusedLocationSource;
import com.naver.maps.map.widget.CompassView;
import com.naver.maps.map.widget.LocationButtonView;
import com.naver.maps.map.widget.ScaleBarView;
import com.naver.maps.map.widget.ZoomControlView;
public class NaverCustomMarkerActivity extends AppCompatActivity implements OnMapReadyCallback, Overlay.OnClickListener{
private FusedLocationSource locationSource;
private NaverMap mNaverMap;
LocationManager locationManager;
private static final int PERMISSION_REQUEST_CODE = 100;
private static final String[] PERMISSIONS = {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_naver_custom_marker);
//지도 객체 생성하기
FragmentManager fragmentManager = getSupportFragmentManager();
MapFragment mapFragment = (MapFragment) fragmentManager.findFragmentById(R.id.map);
if(mapFragment == null){
mapFragment = MapFragment.newInstance();
fragmentManager.beginTransaction().add(R.id.map, mapFragment).commit();
}
//getMapAsync 호출해 비동기로 onMapReady 콜백 메서드 호출
//onMapReady에서 NaverMap 객체를 받음.
mapFragment.getMapAsync(this);
//위치를 반환하는 구현체인 FusedLocationSource 생성
locationSource = new FusedLocationSource(this, PERMISSION_REQUEST_CODE);
}
@Override
public void onMapReady(@NonNull NaverMap naverMap) {
Marker marker = new Marker();
marker.setPosition(new LatLng(37.5670135,126.9783740));
marker.setMap(naverMap);
// 커스텀 마커 구현
marker.setWidth(100); // 마커 길이
marker.setHeight(100); // 마커 높이
marker.setIcon(OverlayImage.fromResource(R.drawable.crown)); // 마커에 이미지 설정
marker.setOnClickListener(this); // 마커 클릭 이벤트
mNaverMap = naverMap;
//mNaverMap.setLocationSource(locationSource);
// 마커 커스텀 하기
UiSettings uiSettings = mNaverMap.getUiSettings();
uiSettings.setCompassEnabled(false);
uiSettings.setScaleBarEnabled(false);
uiSettings.setZoomControlEnabled(false);
uiSettings.setLocationButtonEnabled(false);
uiSettings.setLogoGravity(Gravity.RIGHT | Gravity.BOTTOM);
CompassView compassView = findViewById(R.id.compass);
compassView.setMap(mNaverMap);
ScaleBarView scaleBarView = findViewById(R.id.scalebar);
scaleBarView.setMap(mNaverMap);
ZoomControlView zoomControlView = findViewById(R.id.zoom);
zoomControlView.setMap(mNaverMap);
LocationButtonView locationButtonView = findViewById(R.id.location);
locationButtonView.setMap(mNaverMap);
// 권한 확인, 결과는 onRequestPermissionResult 콜백 메서드 호출
ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_REQUEST_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// request code와 권한 획득 여부 확인
if(requestCode == PERMISSION_REQUEST_CODE){
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
mNaverMap.setLocationTrackingMode(LocationTrackingMode.Follow);
}
}
}
@Override
public boolean onClick(@NonNull Overlay overlay) {
if(overlay instanceof Marker){
Toast.makeText(this.getApplicationContext(), "마커가 선택되었습니다.", Toast.LENGTH_LONG).show();
return true;
}
return false;
}
}
'안드로이드 자바' 카테고리의 다른 글
[Android][Java] WebRTC library 사용해서 내 화면 가져오기 (0) | 2023.07.07 |
---|---|
[Android][JAVA] ListView로 구현하는 TodoList (0) | 2023.07.03 |
[Android][JAVA] TextToSpeech를 사용해 텍스트(Text)를 음성으로 바꾸기 (0) | 2023.06.26 |
[Android][JAVA] Notification 알림창에 액션(버튼) 기능 추가하기 (0) | 2023.06.25 |
[Android][JAVA] 입력한 내용을 텍스트 파일에 저장하기 (0) | 2023.06.22 |