如何在 Here Maps API for JavaScript 上实现 Google 类似地图的滚动行为?

How to achieve Google Maps-like scrolling behavior on Here Maps API for JavaScript?

我正在为 JavaScript 使用 Here's Maps API 并尝试在移动设备上实现类似于 Google 地图 API 的滚动行为。

当我想通过触摸地图滚动时,滚动页面不应该总是被阻止,除非地图的拖动行为被禁用.

我试过调用window.scroll()从指针事件中提取相应的Y参数,但是没有浏览器默认滚动那么流畅。

我应该如何使用 drag 或其他一些针对地图的事件来滚动页面?

您可以通过以下方式允许在地图上滚动:

  1. dragstart 上禁用地图的拖动行为并捕获 Y 坐标。
  2. dragend 上启用地图的拖动行为并捕获 Y 坐标。
  3. dragend.
  4. 上按开始和结束Y坐标之差滚动页面
var mapEvents = new H.mapevents.MapEvents(map);
var beh = new H.mapevents.Behavior(mapEvents);
var startY, endY = 0;
map.addEventListener("dragstart", function(evt) {
   startY = evt.currentPointer.viewportY;
   beh.disable(H.mapevents.Behavior.DRAGGING);
});

map.addEventListener("dragend", function(evt) {
   endY = evt.currentPointer.viewportY;
   window.scrollBy(0, (startY - endY));
   beh.enable(H.mapevents.Behavior.DRAGGING);
});

此代码应该适合您:

let mapevents = new mapsjs.mapevents.MapEvents(map),
    behavior = new mapsjs.mapevents.Behavior(mapevents);

let startY, endY = 0;
map.addEventListener('dragstart', function(evt) {
  if (evt.currentPointer.type == 'touch' && evt.pointers.length < 2) {
    startY = evt.currentPointer.viewportY;
    behavior.disable(H.mapevents.Behavior.DRAGGING);
  }
});

map.addEventListener('drag', function(evt) {
  if (evt.currentPointer.type == 'touch' && evt.pointers.length < 2) {
    endY = evt.currentPointer.viewportY;
    window.scrollBy(0, (startY - endY));
  }
});

map.addEventListener('dragend', function(evt) {
  behavior.enable(H.mapevents.Behavior.DRAGGING);
});

dragstartdrag 回调中,仅当指针类型为 touch 且指针数量为 1 时才禁用滚动。这使得缩放和平移地图成为可能触摸设备上的两个手指以及台式机/笔记本电脑上的鼠标。

请注意,该方法 behavior.isEnabled(feature) 不会禁用该功能。为此,您需要使用 behavior.disable(opt_features) 请参阅 https://developer.here.com/documentation/maps/topics_api/h-mapevents-behavior.html