[Android] 라벨 위치 고정

[FAQ] 지도/로컬 API 문의 전 꼭 읽어 주세요.
https://devtalk.kakao.com/t/faq-api/125610

라벨의 위치를 항상 지도의 가운데에 고정 시키는 방법이 있을까요? 카카오 택시에서 출발지를 선택하는 것처럼요.
setOnCameraMoveEndListener에 라벨표시를 넣으니까 카메라 움직임이 끝나고 나서야 라벨이 이동해요.

지도의 이동과 상관없이 화면좌표에 고정되게 UI 를 표시하기 위해서, MapWidget 을 이용하시면 됩니다.

다만, 카카오택시의 출발지 선택처럼 가운데 위치시키는 것 뿐만 아니라, 해당 출발지 마커의 지도 위치값도 알아야 하고 더 유연하게 사용하시려면 아래와 같이 지도의 MapView 중앙에 Android 의 ImageView 를 위치시키는게 좋을 듯 보여집니다.

1. MapView 가 있는 xml 레이아웃 에서, 특정 이미지를 지도의 중앙에 위치시킴.

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.kakao.vectormap.MapView
        android:id="@+id/map_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ImageView
        android:id="@+id/iv_center_marker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/blue_marker"
        android:paddingBottom="100px"/>
</RelativeLayout>

2. 코드 상에서, 지도 중앙에 있는 ImageView 의 지도 위치값을 계산해옴.

Label centerLabel = kakaoMap.getLabelManager().getLayer()
        .addLabel(LabelOptions.from(centerLocation).setStyles(R.drawable.red_dot_marker));

kakaoMap.setOnCameraMoveEndListener(new KakaoMap.OnCameraMoveEndListener() {
    @Override
    public void onCameraMoveEnd(@NonNull KakaoMap kakaoMap,
                                @NonNull CameraPosition cameraPosition,
                                @NonNull GestureType gestureType) {

        ImageView ivCenter = findViewById(R.id.iv_center_marker);

        // 지도 중앙에 위치한 이미지(iv_center_marker)의 좌표값을 구하는 방법
        // 화면상의 특정 위치에 해당하는 지도 좌표값을 구하는 kakaoMap.fromScreenPoint() 함수 활용
        // x : iv_center_marker 이미지의 x 값에 이미지 가로크기 1/2 을 더하기
        // y : iv_center_marker 이미지의 y 값에 이미지 세로크기를 더하기.추가로 paddingBottom 100px 한 부분을 빼주기
        LatLng centerLocation = kakaoMap.fromScreenPoint(
                (int) ivCenter.getX() + ivCenter.getWidth() / 2,
                (int) ivCenter.getY() + ivCenter.getHeight() - 100);

        centerLabel.moveTo(centerLocation); // 라벨의 위치이동 - 계산된 위치값을 확인하기 위한 라벨
    }
});