一. 问题描述

当用户通过缩放手势、平移手势、倾斜手势和旋转手势与地图交互,控制地图移动改变其可见区域时,华为地图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】关于无法判断和区分用户与地图交互手势类型的解决办法的更多相关文章

  1. SQLite实现用户数据存储+Android之app:lintVitalRelease解决办法

    今日所学 SQLite实现用户数据存储 遇到的问题 界面没能显示出存在数据库中的信息 明日计划 查找界面没能显示出存在数据库中的信息的原因 报错:app:lintVitalRelease 解决办法: ...

  2. Windows10家庭版用户无法在计算机管理更改权限的解决办法

    问题描述:今天因为动了注册表导致windows登陆界面只剩下一个管理员账号,而平常用的账号不知所踪~这个问题本来很好解决,但是由于在用的笔记本安装的是Windows家庭中文版,无法通过计算机管理在本地 ...

  3. Mac普通用户修改了/etc/sudoers文件的解决办法

    1.开启 Root 账户 打开“系统偏好设置”,进入“用户与群组”面板,记得把面板左下角的小锁打开,然后选择面板里的“登录选项”.在面板右边你会看到“网络账户服务 器”,点击它旁边的“加入…”按钮,再 ...

  4. 暗黑破坏神2:Tab打开地图就变卡顿解决办法

    我是VM虚拟机安装的WIN XP,系统镜像是:zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14.iso 以前也是这个系 ...

  5. Oracle“记录被另一个用户锁住” 无法更新删除的解决办法

    1.查看数据库锁,诊断锁的来源及类型: select object_id,session_id,locked_mode from v$locked_object; 或者用以下命令: select b. ...

  6. c# usercontrol 用户自定义控件无法显示在工具箱的解决办法

    由于最开始x86平台,后来换成anyCPU 重新编译也没有删除x86目录下的dll ,也没重新生成 费x86 下的dll , 导致工具箱无法找到目录下的dll 无法加载自定义控件 右击工具栏中的内容选 ...

  7. ubuntu root用户下找不到环境变量解决办法

    打开 gedit /root/.bashrc   ,在文件的末尾添加: source /etc/profile 然后执行更新:source /root/.bashrc

  8. 百度地图api的覆盖物样式与bootstrap样式冲突解决办法

    使用百度地图api 和 bootstrap ,发现标注样式出现了问题 label左侧 宽度变得非常窄 正常情况下应该是下面这样的: 原因是boostrap样式和百度地图样式冲突了. 解决办法: .ba ...

  9. mac 安装mysql + 修改root用户密码 + 及报Access denied for user 'root'@'localhost' (using password:YES)解决办法

    1.下载MySQL 到mysql的官网http://dev.mysql.com/downloads/mysql/然后在页面中会看到“MySQL Community Server”下方有一个“downl ...

  10. 创建用户故事地图(User Story Mapping)的8个步骤

    [小编]上周六了解了用户故事地图后,小编又查阅了一些资料,找到了以下这篇关于如何组织用户故事地图规划的文章,分享给大家.也希望大家如果有好的实践,也可以留言一起交流. 原文地址:http://winn ...

随机推荐

  1. error LNK2019: unresolved external symbol _CrtDbgReport referenced in function xxxx

    现象 在用C++调试dll动态库的时候汇报上述错误,我用VS2015编译的DEBUG版本动态库,实际在VS2019中调试 解决方法 在工程属性中做出如下选择,代码生成->多线程调试DLL ,出现 ...

  2. 【Azure Storage Account Table】询问批量将存储账户中的表嵌入另一个账户中的办法

    问题描述 询问批量将存储账户中的表嵌入另一个账户中的办法? 问题解答 方式一:使用 AzCopy 使用Az copy做表格的导入导出,注意您需要使用Azcopy 7.3版本来实现对Table的操作,可 ...

  3. 使用Kubernetes搭建带有ik分词的Elasticsearch集群

    创建好带有Ik分词的es镜像,并上传到镜像仓库中,创建镜像可参考链接中的文档 https://www.cnblogs.com/hi-lijq/p/16895206.html 编写es_cluster- ...

  4. C++学习笔记之高级语法

    目录 高级语法 面向对象--类 对象的属性 运算符重载 拷贝构造函数 IO缓存 头文件的重复包含问题 深拷贝与浅拷贝 面向对象三大特性 高级语法 面向对象--类 C++使用struct.class来定 ...

  5. Android Studio自带模拟器无法访问网络问题解决

    测试APP的时候,发现Android Studio自带的模拟器访问不了百度等网站,之前一直用的好好的,觉得可能是版本的问题,也有可能是公司网络的问题(因为在家里的电脑的Android Studio的模 ...

  6. 一个简单的百万并发的TCP服务器的实现。

    我们紧接着上篇文章,看看我们上节课的代码有什么问题? 可以明显的看出来上节课的代码公用了一个同样的缓冲区进行读写,正常的情况下我们需要封装一个结构体,让每个对应的客户端的FD都有独立的结构进行读写还有 ...

  7. 用于演示文稿的新 Dapr 幻灯片

    Dapr 官方博客上(https://blog.dapr.io/posts/2024/03/10/new-dapr-slide-deck-for-your-presentations/)发布了一个新的 ...

  8. android ndk生成第三方库的so方法(ndk-build,Application.mk,Android.mk)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  9. [极客大挑战 2019]web部分题解(sql部分已完结,其他部分正在更新,出去吃个饭先)

    [极客大挑战 2019]BabySQL 打开环境后有登录界面◕‿◕ 一眼注入,后先试试万能密码: username:admin' or '1'='1 password:1 GG,出大问题,我就会这一招 ...

  10. 三维模型OBJ格式轻量化的数据压缩与性能平衡分析

    三维模型OBJ格式轻量化的数据压缩与性能平衡分析 三维模型的OBJ格式轻量化数据压缩在保持性能的同时,可以减小文件大小.提高加载速度和节省存储空间.然而,在进行数据压缩时,需要权衡压缩比率和模型质量之 ...