uni-app 高德地图 regionchange 通过api moveToLocation调用时 causeBy 返回 drag 并非和小程序一样 返回update

uni-app 高德地图 regionchange 通过api moveToLocation调用时 causeBy 返回 drag 并非和小程序一样 返回update

开发环境 版本号 项目创建方式
Mac 14.4 (23E214) HBuilderX

示例代码:

app 高德地图 regionchange 通过api moveToLocation去调用  causeBy 返回 drag 并非和小程序一样 返回update

操作步骤:

安卓机型 通过api 调用 moveToLocation函数 ,
map的regionchange 返回causeBy 为 drag,实际应该是update

预期结果:

map的regionchange 返回causeBy 应该是update

实际结果:

causeBy 字段  为drag

bug描述:

uniapp 高德地图 regionchange 通过api moveToLocation去调用  causeBy 返回 drag 并非和小程序一样 返回update

更多关于uni-app 高德地图 regionchange 通过api moveToLocation调用时 causeBy 返回 drag 并非和小程序一样 返回update的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

vu3 怎么创建这个地图实例呀,老哥
const instance = getCurrentInstance(); let myMap=uni.createMapContext(“map1”,instance)
const map1=ref(null)
我这2个方法创建出来的都不对呢 方法调用不了

更多关于uni-app 高德地图 regionchange 通过api moveToLocation调用时 causeBy 返回 drag 并非和小程序一样 返回update的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni.createMapContext(“map”, getCurrentInstance());

这个代码是对的

uni-app 中使用高德地图时,regionchange 事件的 causeBy 返回值可能与小程序中的行为不一致。具体来说,当你通过 moveToLocation API 移动地图时,causeBy 可能会返回 drag 而不是 update

原因分析

  1. moveToLocation 的实现机制

    • moveToLocation 是通过编程方式移动地图到指定位置,其内部实现可能触发了地图的拖动事件(drag),而不是直接触发 update 事件。
    • 这与用户手动拖动地图的行为类似,因此 causeBy 返回 drag
  2. 小程序与 uni-app 的差异

    • 小程序的高德地图组件可能对 regionchange 事件的处理方式不同,导致在某些情况下返回 update
    • uni-app 的高德地图组件是基于原生高德地图 SDK 封装的,其行为可能与小程序有差异。

解决方案

如果你需要在 uni-app 中区分 moveToLocation 和其他操作(如用户拖动),可以通过以下方式处理:

  1. 自定义标志位

    • 在调用 moveToLocation 时设置一个标志位,然后在 regionchange 事件中根据标志位判断是否是由 moveToLocation 触发的。
    let isMoveToLocation = false;
    
    function moveToLocation() {
        isMoveToLocation = true;
        map.moveToLocation({
            latitude: 39.90469,
            longitude: 116.40717
        });
    }
    
    map.on('regionchange', (event) => {
        if (isMoveToLocation) {
            console.log('Triggered by moveToLocation');
            isMoveToLocation = false; // 重置标志位
        } else {
            console.log('Triggered by other action:', event.causeBy);
        }
    });
    
  2. 延时判断

    • 由于 regionchange 事件可能会多次触发,可以在事件处理中加入延时判断,确保在 moveToLocation 调用后的一段时间内忽略 drag 事件。
    let isMoveToLocation = false;
    
    function moveToLocation() {
        isMoveToLocation = true;
        map.moveToLocation({
            latitude: 39.90469,
            longitude: 116.40717
        });
    
        setTimeout(() => {
            isMoveToLocation = false;
        }, 1000); // 1秒后重置标志位
    }
    
    map.on('regionchange', (event) => {
        if (isMoveToLocation && event.causeBy === 'drag') {
            console.log('Triggered by moveToLocation');
        } else {
            console.log('Triggered by other action:', event.causeBy);
        }
    });
回到顶部