【FAQ】关于无法判断和区分用户与地图交互手势类型的解决办法

faq,关于,无法,判断,区分,用户,地图,交互,手势,类型,解决办法 · 浏览次数 : 14

小编点评

**问题描述:** 当用户通过缩放手势、平移手势、倾斜手势和旋转手势与地图交互,控制地图移动改变其可见区域时,华为地图SDK没有提供直接获取用户手势类型的API。 **解决方案:** 1. **创建地图实例并实现地图相机的侦听事件:** - 在 Activity 的布局文件中添加地图控件并设置地图属性。 - 在 Activity 中初始化 SDK、加载地图并实现地图相机的侦听事件。 2. **获取用户与地图交互手势类型:** - 在 `onCameraMoveStarted()` 方法中,获取新的 CameraPosition 对象的属性值 (zoom、tilt、bearing)。 - 在 `onCameraIdle()` 方法中,计算用户与地图相机的交互类型。 3. **根据交互类型进行处理:** - 根据用户与地图交互类型进行不同的处理。 - 例如,当用户进行平移手势时,需要计算移动的距离和方向;当用户进行旋转手势时,需要计算旋转的角度。 **代码示例及效果展示:** ```java // 获取地图实例 SupportMapFragment mSupportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapfragment_camera_gesturetype); // 初始化地图 mSupportMapFragment.getMapAsync(this); // 地图移动侦听器 this.huaweiMap.setOnCameraMoveStartedListener(this); this.huaweiMap.setOnCameraMoveListener(this); this.huaweiMap.setOnCameraIdleListener(this); ``` **Gif图说明:** a.\t平移和缩放手势类型:用户进行平移或缩放手势时,地图相机的位置会发生变化,因此移动类型会改变。 b.\t旋转手势类型:用户进行旋转手势时,地图相机会绕着固定点旋转,因此移动类型会改变。 c.\t倾斜手势类型:用户进行倾斜手势时,地图相机会绕着固定点移动,因此移动类型会改变。 **参考资料:** - HMS Core 地图 SDK 文档 - HMS Core 地图开发指南文档

正文

一. 问题描述

当用户通过缩放手势、平移手势、倾斜手势和旋转手势与地图交互,控制地图移动改变其可见区域时,华为地图SDK没有提供直接获取用户手势类型的API。

二. 解决方案

  1. 华为地图SDK的地图相机有提供CameraPosition类,此类包括所有相机位置参数,如位置、方位、倾斜角度和缩放级别。具体可以查看下图:

  1. 华为地图SDK同时也有提供地图相机的移动侦听事件,应用层可以通过设置侦听器对地图相机的移动状态进行侦听,比如地图相机开始移动、停止移动等事件。

  2. 如果要判断用户与地图的交互手势,可以在地图相机开始移动的侦听事件中分别记录target、bearing、tilt和zoom的初始值。在地图相机移动结束的侦听事件中重新获取target、bearing、tilt和zoom的最终值。

  3. 分别计算target、bearing、tilt和zoom的初始值与最终值是否有变动,来判断用户与地图的交互手势类型。

三. 代码示例及效果展示

  1. 创建地图实例并实现地图相机移动的侦听事件。

a. 在Activity的布局文件中添加地图控件且设置地图属性。

<?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. 地图相机属性

了解更多详情>>

访问地图服务联盟官网

获取地图服务开发指导文档

访问HMS Core 联盟官网

获取HMS Core 开发指导文档

关注我们,第一时间了解 HMS Core 最新技术资讯~

与【FAQ】关于无法判断和区分用户与地图交互手势类型的解决办法相似的内容:

【FAQ】关于无法判断和区分用户与地图交互手势类型的解决办法

### 一. 问题描述 当用户通过缩放手势、平移手势、倾斜手势和旋转手势与地图交互,控制地图移动改变其可见区域时,华为地图SDK没有提供直接获取用户手势类型的API。 ### 二. 解决方案 1. 华为地图SDK的地图相机有提供CameraPosition类,此类包括所有相机位置参数,如位置、方位、

【FAQ】关于华为地图服务定位存在偏差的原因及解决办法

一、 问题描述: 华为地图服务“我的位置”能力,在中国大陆地区,向用户展示他们在地图上的当前位置与用户的实际位置存在较大的偏差。 具体差别可以查看下方的图片: 二、 偏差较大的原因: 华为Map SDK在中国大陆使用的地理坐标系是GCJ02。 点击“我的位置”控件,获取的定位经纬度的地理坐标系是WG

【FAQ】关于华为推送服务因营销消息频次管控导致服务通讯类消息下发失败的解决方案

一. 问题描述 使用华为推送服务下发IM消息时,下发消息请求成功且code码为80000000,但是手机总是收不到消息; 在华为推送自助分析(Beta)平台查看发现,消息发送触发了频控。 二. 问题原因及背景 2023年1月05日起,华为推送服务对咨询营销类消息做了单个设备每日推送数量上限管理,具体

【FAQ】关于JavaScript版本的华为地图服务Map的点击事件与Marker的点击事件存在冲突的解决方案

一. 问题描述 创建地图对象,并添加marker标记,对map和marker均添加了点击事件;

【FAQ】关于华为地图服务定位存在偏差的原因及解决办法(二)——仅适用于Location 6.7.0.300及之后的版本

### 一、 问题描述: 华为地图服务“我的位置”能力,在中国大陆地区,向用户展示他们在地图上的当前位置与用户的实际位置存在较大的偏差。 具体差别可以查看下方的图片: ![image](https://img2023.cnblogs.com/blog/2396482/202306/2396482-2

【FAQ】关于CP反馈的联运应用的常见结算问题小结

### 问题一:为什么在“我的账户”>>“收益”里面的金额和支付报表中的金额对不上 ? 关于联运类应用付费产品在华为平台上结算问题,您可以详细参考一下“[华为商户服务协议](https://developer.huawei.com/consumer/cn/doc/start/merchantserv

【FAQ】关于获取运动健康数据的常见问题及解答

目录 一、Health Kit健康数据采样, 原子采样数据问题 二、Health Kit查询历史数据查询数据和返回数据不一致 三、Health Kit关于获取历史数据问题 四、调用Health Kit接口出现获取不到数据的情况 问题解答 Q1:Health Kit健康数据采样, 原子采样数据问题 【

FAQ 关于pip你应该知道的一些技巧

pip简介 pip是安装了python之后的一个应用程序,包管理程序,有点类似于yum、npm、apt等工具 物理位置一般是python.exe所在目录下的scripts下 以我为例,我Python安装在D:\Python39\下,那么pip就在D:\Python39\Scripts 而这个工具所在

【FAQ】统一扫码服务常见问题及解答

1.隐私政策是怎么样的?收集哪些信息? 关于Scan Kit的隐私政策及收集的信息,请查看SDK隐私安全说明。 Android:SDK隐私安全说明 iOS:SDK隐私安全说明 2.如何使用多码识别?多码模式下如何实现指定条码?多码模式的坐标支持返回坐标么?多码模式下实现自动放大? 1)统一扫码服务支

CANN开发实践:4个DVPP内存问题的典型案例解读

摘要:由于DVPP媒体数据处理功能对存放输入、输出数据的内存有更高的要求(例如,内存首地址128字节对齐),因此需调用专用的内存申请接口,那么本期就分享几个关于DVPP内存问题的典型案例,并给出原因分析及解决方法。 本文分享自华为云社区《FAQ_DVPP内存问题案例》,作者:昇腾CANN。 DVPP