You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

AmCharts Maps(amMaps)触屏设备缩放跳转bug技术咨询

AmCharts amMaps Worldlow 触屏缩放跳转Bug修复方案

我之前也碰到过这个触屏交互的坑,这其实是AmCharts默认触摸事件处理的一个小缺陷——当双指缩放中途变成单指时,地图没法正确识别状态切换,误把残留的单指操作当成了平移或缩放触发,直接导致区域跳转。

问题复现步骤

  • 用触屏设备打开搭载Worldlow地图的页面
  • 双指触屏进行缩放操作,保持两根手指在屏幕上
  • 抬起其中一根手指,仅留另一根手指在屏幕上,此时地图缩放区域会出现异常跳转

原因分析

AmCharts的默认触摸监听在处理触摸点数量变化时,没有及时重置缩放/平移的状态标记。当双指操作突然变为单指时,之前的缩放计算上下文没被清除,导致单指移动被错误代入缩放逻辑,引发了区域偏移。

修复方案

我们可以通过自定义触摸事件监听,手动追踪触摸点数量,在状态切换时临时调整地图的交互权限,避免误触发:

// 初始化你的Worldlow地图实例
const map = am4core.create("chartdiv", am4maps.MapChart);
// 这里添加你的地图配置(如地图数据源、投影方式等)...

// 追踪当前屏幕上的触摸点数量
let activeTouches = 0;

// 监听触摸开始事件
map.svgContainer.htmlElement.addEventListener('touchstart', (event) => {
  activeTouches = event.touches.length;
});

// 监听触摸结束事件
map.svgContainer.htmlElement.addEventListener('touchend', (event) => {
  activeTouches = event.touches.length;
  
  // 当触摸点从2变为1时,临时禁用单指交互
  if (activeTouches === 1) {
    map.draggable = false;
    map.zoomable = false;
    
    // 短暂延迟后恢复正常交互,不影响后续操作
    setTimeout(() => {
      map.draggable = true;
      map.zoomable = true;
    }, 150);
  }
});

// 监听触摸移动事件,实时更新触摸点数量
map.svgContainer.htmlElement.addEventListener('touchmove', (event) => {
  activeTouches = event.touches.length;
  
  // 如果触摸点回到2,立即恢复双指缩放权限
  if (activeTouches === 2) {
    map.draggable = true;
    map.zoomable = true;
  }
});

代码说明

这段代码的核心逻辑很简单:

  1. 实时追踪屏幕上的触摸点数量
  2. 当双指缩放后只剩单指时,临时关闭地图的拖拽和缩放功能,避免错误触发跳转
  3. 短暂延迟后恢复交互,确保用户后续的单指操作(如平移)能正常使用
  4. 若再次回到双指操作,立即恢复缩放权限,不影响正常的双指缩放体验

如果这个方案效果不佳,还可以尝试通过AmCharts的内置事件系统(如map.events.on("touchstart", ...))来拦截和修改默认的触摸处理逻辑,不过上面的原生事件监听方案兼容性更好,实现成本也更低。

内容的提问来源于stack exchange,提问作者Echecivuole

火山引擎 最新活动