【FAQ】사용자가 지도와 상호작용하는 제스처 유형을 판단하고 구별할 수 없는 문제에 대한 해결책

하나. 문제 설명

사용자가 확대/축소 제스처, 팬 제스처, 기울이기 제스처 및 회전 제스처를 통해 지도와 상호 작용하고 지도를 제어하여 가시 영역을 이동하고 변경할 때 Huawei Map SDK는 사용자 제스처 유형을 직접 가져오기 위한 API를 제공하지 않습니다. .

둘. 해결책

  1. Huawei Maps SDK의 맵 카메라는 위치, 방향, 기울기 각도 및 줌 레벨과 같은 모든 카메라 위치 매개변수를 포함하는 CameraPosition 클래스를 제공합니다. 자세한 내용은 다음 그림을 참조하십시오.

  1. Huawei Maps SDK는 지도 카메라 움직임 모니터링 이벤트도 제공합니다.애플리케이션 계층은 지도 카메라가 움직이기 시작하고 움직임을 멈추는 것과 같은 이벤트와 같은 지도 카메라의 움직임 상태를 수신하도록 리스너를 설정할 수 있습니다.

  2. 사용자와 지도 간의 상호 작용 제스처를 판단하려면 지도 카메라가 움직이기 시작할 때 대상, 방위, 기울기 및 확대/축소의 초기 값을 청취 이벤트에 기록할 수 있습니다. 맵 카메라 이동 종료 리스닝 이벤트에서 타겟, 방위, 틸트, 줌의 최종 값을 다시 획득합니다.

  3. 타겟, 방위, 기울기, 확대/축소의 초기 및 최종 값이 변경되었는지 여부를 계산하여 사용자와 지도 간의 상호 작용 제스처 유형을 결정합니다.

삼. 코드 예제 및 효과 표시

  1. 지도 인스턴스를 만들고 지도 카메라 이동에 대한 수신 이벤트를 구현합니다.

활동의 레이아웃 파일에 지도 컨트롤을 추가하고 지도 속성을 설정합니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        android:id="@+id/mapfragment_camera_gesturetype"
        class="com.huawei.hms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        map:cameraTargetLat="48.893478"
        map:cameraTargetLng="2.334595"
        map:cameraZoom="10" />

</androidx.constraintlayout.widget.ConstraintLayout>

b.Activity에서 SDK를 초기화하고 지도를 불러온 후 지도 카메라의 리스닝 이벤트를 구현합니다.

public class HwMapCameraGestureTypeActivity extends AppCompatActivity implements OnMapReadyCallback,
        HuaweiMap.OnCameraMoveStartedListener, HuaweiMap.OnCameraMoveListener, HuaweiMap.OnCameraIdleListener {
    public static String LOG_TAG_MAP = "HW_MAP_LOG";
    private SupportMapFragment mSupportMapFragment;
    //HuaweiMap对象
    private HuaweiMap huaweiMap;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 初始化SDK
        MapsInitializer.initialize(this);
        setContentView(R.layout.activity_hwmap_camera_gesturetype);
        //加载地图
        mSupportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapfragment_camera_gesturetype);
        mSupportMapFragment.getMapAsync(this);
    }

    //地图初始化成功的回调方法
    @Override
    public void onMapReady(HuaweiMap huaweiMap) {
        this.huaweiMap = huaweiMap;
        //设置地图相机的移动侦听事件
        this.huaweiMap.setOnCameraMoveStartedListener(this);
        this.huaweiMap.setOnCameraMoveListener(this);
        this.huaweiMap.setOnCameraIdleListener(this);
    }

    //地图相机开始移动的回调
    @Override
    public void onCameraMoveStarted(int i) {
        Log.w(LOG_TAG_MAP, "地图相机开始移动");
    }

    //地图相机移动过程中的回调
    @Override
    public void onCameraMove() {

    }

    //地图相机移动结束的回调
    @Override
    public void onCameraIdle() {
        Log.w(LOG_TAG_MAP, "地图相机结束移动");
    }
}

c.아래 Gif에서 볼 수 있듯이 맵 카메라가 움직이기 시작하고 움직임이 끝나면 해당 로그가 출력됩니다.

여기에 이미지 설명 삽입

  1. 새로운 initZoomValue, initTiltValue, initBearingValue 객체를 생성하여 지도 카메라가 움직일 때 초기 속성 값을 기록하고 onCameraMoveStarted(int i) 수신 방법에서 새로 생성된 객체에 값을 할당합니다.
/**
 * 初始值对象
 * initZoomValue-屏幕中心附近的缩放级别初始值。
 * initTiltValue-相机角度与垂直于地球表面的线的夹角初始值。
 * initBearingValue-相机指向的方向初始值。
 */
private float initZoomValue, initTiltValue, initBearingValue;

//地图相机开始移动的回调
@Override
public void onCameraMoveStarted(int i) {
    Log.w(LOG_TAG_MAP, "地图相机开始移动");
    if (null != huaweiMap && null != huaweiMap.getCameraPosition()) {
        //记录相机移动时的相机各个属性的初始值
        initZoomValue = huaweiMap.getCameraPosition().zoom;
        initTiltValue = huaweiMap.getCameraPosition().tilt;
        initBearingValue = huaweiMap.getCameraPosition().bearing;
    }
}
  1. onCameraIdle() 메서드에서 지도 카메라와의 사용자 상호 작용 유형을 계산합니다.
//地图相机移动结束的回调
@Override
public void onCameraIdle() {
    //计算用户与相机的交互手势类型
    if (null != huaweiMap && null != huaweiMap.getCameraPosition()) {
        //通过计算zoom的值是否发生变化 判断用户与地图交互类型是平移还是旋转
        if (initZoomValue != huaweiMap.getCameraPosition().zoom) {
            Log.w(LOG_TAG_MAP, "地图相机结束移动,移动类型为:缩放");
        } else {
            Log.w(LOG_TAG_MAP, "地图相机结束移动,移动类型为:平移");
        }
        //通过计算Tilt的值是否发生变化 判断用户与地图交互类型是否是倾斜手势
        if (initTiltValue != huaweiMap.getCameraPosition().tilt) {
            Log.w(LOG_TAG_MAP, "地图相机结束移动,移动类型为:倾斜");
        }
        //通过计算Bearing的值是否发生变化 判断用户与地图交互类型是否是旋转手势
        if (initBearingValue != huaweiMap.getCameraPosition().bearing) {
            Log.w(LOG_TAG_MAP, "地图相机结束移动,移动类型为:旋转");
        }
    }
}
  1. 아래의 Gif 사진을 통해 특정 효과를 볼 수 있습니다.

a. 이동 및 확대/축소 제스처 유형:

여기에 이미지 설명 삽입

b. 회전 제스처 유형:

여기에 이미지 설명 삽입

C. 기울이기 제스처 유형:

넷. 참조

  1. 지도 인스턴스 만들기

  2. 지도 카메라 움직임 모니터링

  3. 카메라 속성 매핑

자세히 알아보기>>

Map Service Alliance의 공식 웹 사이트를 방문하십시오.

지도 서비스 개발 안내 문서 받기

HMS Core Alliance의 공식 웹 사이트를 방문하십시오 .

HMS Core 개발 지침 문서 얻기

팔로우하고 처음으로 HMS Core의 최신 기술 정보를 알아보세요~

추천

출처blog.csdn.net/HUAWEI_HMSCore/article/details/131941628